{"version":3,"file":"vidau-sso.umd.cjs","sources":["../src/core/affiliate.ts","../src/core/config.ts","../src/core/cookie.ts","../node_modules/jsencrypt/lib/lib/jsbn/util.js","../node_modules/jsencrypt/lib/lib/jsbn/base64.js","../node_modules/jsencrypt/lib/lib/asn1js/hex.js","../node_modules/jsencrypt/lib/lib/asn1js/base64.js","../node_modules/jsencrypt/lib/lib/asn1js/int10.js","../node_modules/jsencrypt/lib/lib/asn1js/asn1.js","../node_modules/jsencrypt/lib/lib/jsbn/jsbn.js","../node_modules/jsencrypt/lib/lib/jsbn/prng4.js","../node_modules/jsencrypt/lib/lib/jsbn/rng.js","../node_modules/jsencrypt/lib/lib/jsbn/sha256.js","../node_modules/jsencrypt/lib/lib/jsbn/rsa.js","../node_modules/jsencrypt/lib/lib/jsrsasign/asn1-1.0.js","../node_modules/jsencrypt/lib/JSEncryptRSAKey.js","../node_modules/jsencrypt/lib/JSEncrypt.js","../src/core/encrypt.ts","../src/core/redirect-url.ts","../src/core/event-bus.ts","../src/core/session-sync.ts","../src/core/auth.ts","../src/core/api.ts","../src/core/pricing-api.ts","../src/core/activity.ts","../src/core/analytics.ts","../src/core/sanitize.ts","../src/auth-dialog/vidau-auth-dialog.ts","../src/pricing-dialog/vidau-pricing-dialog.ts","../src/index.ts"],"sourcesContent":["const STORAGE_KEY = 'vidau.sso.aff';\nconst MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\nlet remembered: { code: string; expiresAt: number } | null = null;\n\nexport function normalizeAffiliateCode(value: unknown): string | undefined {\n  if (typeof value !== 'string') return;\n  const code = value.trim();\n  return /^[a-zA-Z0-9_-]{1,32}$/.test(code) ? code.toUpperCase() : undefined;\n}\n\n/** Capture before navigation/OAuth, and re-read when an auth request is made. */\nexport function getAffiliateCode(): string | undefined {\n  if (typeof window === 'undefined') return;\n  const now = Date.now();\n  const params = new URLSearchParams(window.location.search);\n  const incoming = normalizeAffiliateCode(params.get('aff'));\n  if (incoming) {\n    remembered = { code: incoming, expiresAt: now + MAX_AGE_MS };\n    try { window.localStorage.setItem(STORAGE_KEY, JSON.stringify(remembered)); } catch { /* Private mode: retain in memory. */ }\n    // Share attribution across VidAU subdomains, without sharing login credentials.\n    if (typeof document !== 'undefined') {\n      const host = window.location.hostname;\n      const domain = ['vidau.ai', 'vidau.info'].find(d => host === d || host.endsWith(`.${d}`));\n      try {\n        document.cookie = `vidau_aff=${incoming}; Path=/; Max-Age=${MAX_AGE_MS / 1000}; SameSite=Lax${domain ? `; Domain=.${domain}` : ''}${window.location.protocol === 'https:' ? '; Secure' : ''}`;\n      } catch { /* Storage restrictions must not block authentication. */ }\n    }\n    return incoming;\n  }\n  // A newer link on another VidAU subdomain takes precedence over older local storage.\n  if (typeof document !== 'undefined') {\n    try {\n      const cookie = document.cookie.split(';').map(part => part.trim()).find(part => part.startsWith('vidau_aff='));\n      const code = normalizeAffiliateCode(cookie?.slice('vidau_aff='.length));\n      if (code) return code;\n    } catch { /* Fall through to local storage. */ }\n  }\n  try {\n    const stored = JSON.parse(window.localStorage.getItem(STORAGE_KEY) || 'null');\n    if (stored && normalizeAffiliateCode(stored.code) && Number.isFinite(stored.expiresAt)) remembered = stored;\n  } catch { /* Fall through to memory. */ }\n  return remembered && remembered.expiresAt > now ? normalizeAffiliateCode(remembered.code) : undefined;\n}\n","/**\n * 环境配置管理\n * 根据运行环境自动切换 vidau.ai / vidau.info\n */\nimport type { EnvConfig } from '../types';\n\nconst ENV_CONFIGS: Record<string, EnvConfig> = {\n  production: {\n    apiBaseUrl: 'https://sso.vidau.ai/api/sso/',\n    cookieDomain: '.vidau.ai',\n    cookieName: 'VidAu-Token',\n    cookieExpiry: 7,\n    googleClientId: '329716031994-j7kclphmelbo0iqrmjee2ljiuopuuoie.apps.googleusercontent.com',\n    facebookAppId: '633960039516189',\n    appleClientId: 'com.vidau.weblogin.service',\n    microsoftClientId: 'f1e9016f-0267-4498-8388-ed3981269800',\n  },\n  development: {\n    apiBaseUrl: 'https://sso.vidau.info/api/sso/',\n    cookieDomain: '.vidau.info',\n    cookieName: 'VidAu-Token',\n    cookieExpiry: 7,\n    googleClientId: '329716031994-j7kclphmelbo0iqrmjee2ljiuopuuoie.apps.googleusercontent.com',\n    facebookAppId: '633960039516189',\n    appleClientId: 'com.vidau.weblogin.service',\n    microsoftClientId: 'f1e9016f-0267-4498-8388-ed3981269800',\n  },\n};\n\n// 在模块加载时立即获取当前 script\nconst initialScriptSrc = typeof document !== 'undefined' && document.currentScript \n  ? (document.currentScript as HTMLScriptElement).src \n  : '';\n\n/**\n * 根据当前引入的 script src 或域名自动检测环境\n */\nfunction detectEnv(): 'production' | 'development' {\n  if (typeof window === 'undefined') return 'production';\n\n  // 1. 尝试从当前加载的 script src 判断 (针对 UMD / CDN 引入)\n  if (initialScriptSrc) {\n    if (initialScriptSrc.indexOf('vidau.info') > -1) return 'development';\n    if (initialScriptSrc.indexOf('vidau.ai') > -1) return 'production';\n  }\n\n  // 2. 退避策略：如果前端项目本身部署在 vidau.info 域名下\n  const hostname = window.location.hostname;\n  if (hostname.indexOf('vidau.info') > -1) return 'development';\n  \n  return 'production';\n}\n\nlet currentEnv: 'production' | 'development' = 'production';\nlet configOverrides: Partial<EnvConfig> = {};\n\n/**\n * 初始化环境配置\n */\nexport function initConfig(env?: 'production' | 'development', overrides?: Partial<EnvConfig>): void {\n  currentEnv = env || detectEnv();\n  configOverrides = overrides || {};\n}\n\n/**\n * 获取当前环境配置\n */\nexport function getConfig(): EnvConfig {\n  return {\n    ...ENV_CONFIGS[currentEnv],\n    ...configOverrides,\n  };\n}\n\n/**\n * 获取当前环境\n */\nexport function getEnv(): string {\n  return currentEnv;\n}\n","/**\n * 清理升级前遗留的可读 Cookie。当前会话 Cookie 由服务端设置和清除。\n */\nexport function deleteCookie(name: string, domain?: string): void {\n  document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;\n  if (domain) {\n    document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=${domain}`;\n  }\n}\n\n/**\n * 获取设备类型\n */\nexport function getDevice(): string {\n  const ua = navigator.userAgent;\n  if (/Android/i.test(ua)) return 'android';\n  if (/iPhone|iPad|iPod/i.test(ua)) return 'ios';\n  if (/Windows/i.test(ua)) return 'windows';\n  if (/Mac/i.test(ua)) return 'mac';\n  return 'unknown';\n}\n\n/**\n * 解析 JWT 中的用户 ID\n */\nexport function parseJwtUserId(token: string): string {\n  try {\n    if (!token || token.indexOf('.') === -1) return '';\n    const payload = token.split('.')[1];\n    const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');\n    const json = JSON.parse(decodeURIComponent(escape(atob(normalized))));\n    return json.sub || json.user_id || json.uid || json.id || '';\n  } catch {\n    return '';\n  }\n}\n","var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nexport function int2char(n) {\n    return BI_RM.charAt(n);\n}\n//#region BIT_OPERATIONS\n// (public) this & a\nexport function op_and(x, y) {\n    return x & y;\n}\n// (public) this | a\nexport function op_or(x, y) {\n    return x | y;\n}\n// (public) this ^ a\nexport function op_xor(x, y) {\n    return x ^ y;\n}\n// (public) this & ~a\nexport function op_andnot(x, y) {\n    return x & ~y;\n}\n// return index of lowest 1-bit in x, x < 2^31\nexport function lbit(x) {\n    if (x == 0) {\n        return -1;\n    }\n    var r = 0;\n    if ((x & 0xffff) == 0) {\n        x >>= 16;\n        r += 16;\n    }\n    if ((x & 0xff) == 0) {\n        x >>= 8;\n        r += 8;\n    }\n    if ((x & 0xf) == 0) {\n        x >>= 4;\n        r += 4;\n    }\n    if ((x & 3) == 0) {\n        x >>= 2;\n        r += 2;\n    }\n    if ((x & 1) == 0) {\n        ++r;\n    }\n    return r;\n}\n// return number of 1 bits in x\nexport function cbit(x) {\n    var r = 0;\n    while (x != 0) {\n        x &= x - 1;\n        ++r;\n    }\n    return r;\n}\n//#endregion BIT_OPERATIONS\n","import { int2char } from \"./util\";\nvar b64map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar b64pad = \"=\";\nexport function hex2b64(h) {\n    var i;\n    var c;\n    var ret = \"\";\n    for (i = 0; i + 3 <= h.length; i += 3) {\n        c = parseInt(h.substring(i, i + 3), 16);\n        ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);\n    }\n    if (i + 1 == h.length) {\n        c = parseInt(h.substring(i, i + 1), 16);\n        ret += b64map.charAt(c << 2);\n    }\n    else if (i + 2 == h.length) {\n        c = parseInt(h.substring(i, i + 2), 16);\n        ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);\n    }\n    while ((ret.length & 3) > 0) {\n        ret += b64pad;\n    }\n    return ret;\n}\n// convert a base64 string to hex\nexport function b64tohex(s) {\n    var ret = \"\";\n    var i;\n    var k = 0; // b64 state, 0-3\n    var slop = 0;\n    for (i = 0; i < s.length; ++i) {\n        if (s.charAt(i) == b64pad) {\n            break;\n        }\n        var v = b64map.indexOf(s.charAt(i));\n        if (v < 0) {\n            continue;\n        }\n        if (k == 0) {\n            ret += int2char(v >> 2);\n            slop = v & 3;\n            k = 1;\n        }\n        else if (k == 1) {\n            ret += int2char((slop << 2) | (v >> 4));\n            slop = v & 0xf;\n            k = 2;\n        }\n        else if (k == 2) {\n            ret += int2char(slop);\n            ret += int2char(v >> 2);\n            slop = v & 3;\n            k = 3;\n        }\n        else {\n            ret += int2char((slop << 2) | (v >> 4));\n            ret += int2char(v & 0xf);\n            k = 0;\n        }\n    }\n    if (k == 1) {\n        ret += int2char(slop << 2);\n    }\n    return ret;\n}\n// convert a base64 string to a byte/number array\nexport function b64toBA(s) {\n    // piggyback on b64tohex for now, optimize later\n    var h = b64tohex(s);\n    var i;\n    var a = [];\n    for (i = 0; 2 * i < h.length; ++i) {\n        a[i] = parseInt(h.substring(2 * i, 2 * i + 2), 16);\n    }\n    return a;\n}\n","// Hex JavaScript decoder\n// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar decoder;\nexport var Hex = {\n    decode: function (a) {\n        var i;\n        if (decoder === undefined) {\n            var hex = \"0123456789ABCDEF\";\n            var ignore = \" \\f\\n\\r\\t\\u00A0\\u2028\\u2029\";\n            decoder = {};\n            for (i = 0; i < 16; ++i) {\n                decoder[hex.charAt(i)] = i;\n            }\n            hex = hex.toLowerCase();\n            for (i = 10; i < 16; ++i) {\n                decoder[hex.charAt(i)] = i;\n            }\n            for (i = 0; i < ignore.length; ++i) {\n                decoder[ignore.charAt(i)] = -1;\n            }\n        }\n        var out = [];\n        var bits = 0;\n        var char_count = 0;\n        for (i = 0; i < a.length; ++i) {\n            var c = a.charAt(i);\n            if (c == \"=\") {\n                break;\n            }\n            c = decoder[c];\n            if (c == -1) {\n                continue;\n            }\n            if (c === undefined) {\n                throw new Error(\"Illegal character at offset \" + i);\n            }\n            bits |= c;\n            if (++char_count >= 2) {\n                out[out.length] = bits;\n                bits = 0;\n                char_count = 0;\n            }\n            else {\n                bits <<= 4;\n            }\n        }\n        if (char_count) {\n            throw new Error(\"Hex encoding incomplete: 4 bits missing\");\n        }\n        return out;\n    }\n};\n","// Base64 JavaScript decoder\n// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar decoder;\nexport var Base64 = {\n    decode: function (a) {\n        var i;\n        if (decoder === undefined) {\n            var b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n            var ignore = \"= \\f\\n\\r\\t\\u00A0\\u2028\\u2029\";\n            decoder = Object.create(null);\n            for (i = 0; i < 64; ++i) {\n                decoder[b64.charAt(i)] = i;\n            }\n            decoder['-'] = 62; //+\n            decoder['_'] = 63; //-\n            for (i = 0; i < ignore.length; ++i) {\n                decoder[ignore.charAt(i)] = -1;\n            }\n        }\n        var out = [];\n        var bits = 0;\n        var char_count = 0;\n        for (i = 0; i < a.length; ++i) {\n            var c = a.charAt(i);\n            if (c == \"=\") {\n                break;\n            }\n            c = decoder[c];\n            if (c == -1) {\n                continue;\n            }\n            if (c === undefined) {\n                throw new Error(\"Illegal character at offset \" + i);\n            }\n            bits |= c;\n            if (++char_count >= 4) {\n                out[out.length] = (bits >> 16);\n                out[out.length] = (bits >> 8) & 0xFF;\n                out[out.length] = bits & 0xFF;\n                bits = 0;\n                char_count = 0;\n            }\n            else {\n                bits <<= 6;\n            }\n        }\n        switch (char_count) {\n            case 1:\n                throw new Error(\"Base64 encoding incomplete: at least 2 bits missing\");\n            case 2:\n                out[out.length] = (bits >> 10);\n                break;\n            case 3:\n                out[out.length] = (bits >> 16);\n                out[out.length] = (bits >> 8) & 0xFF;\n                break;\n        }\n        return out;\n    },\n    re: /-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n    unarmor: function (a) {\n        var m = Base64.re.exec(a);\n        if (m) {\n            if (m[1]) {\n                a = m[1];\n            }\n            else if (m[2]) {\n                a = m[2];\n            }\n            else {\n                throw new Error(\"RegExp out of sync\");\n            }\n        }\n        return Base64.decode(a);\n    }\n};\n","// Big integer base-10 printing library\n// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256\nvar Int10 = /** @class */ (function () {\n    function Int10(value) {\n        this.buf = [+value || 0];\n    }\n    Int10.prototype.mulAdd = function (m, c) {\n        // assert(m <= 256)\n        var b = this.buf;\n        var l = b.length;\n        var i;\n        var t;\n        for (i = 0; i < l; ++i) {\n            t = b[i] * m + c;\n            if (t < max) {\n                c = 0;\n            }\n            else {\n                c = 0 | (t / max);\n                t -= c * max;\n            }\n            b[i] = t;\n        }\n        if (c > 0) {\n            b[i] = c;\n        }\n    };\n    Int10.prototype.sub = function (c) {\n        // assert(m <= 256)\n        var b = this.buf;\n        var l = b.length;\n        var i;\n        var t;\n        for (i = 0; i < l; ++i) {\n            t = b[i] - c;\n            if (t < 0) {\n                t += max;\n                c = 1;\n            }\n            else {\n                c = 0;\n            }\n            b[i] = t;\n        }\n        while (b[b.length - 1] === 0) {\n            b.pop();\n        }\n    };\n    Int10.prototype.toString = function (base) {\n        if ((base || 10) != 10) {\n            throw new Error(\"only base 10 is supported\");\n        }\n        var b = this.buf;\n        var s = b[b.length - 1].toString();\n        for (var i = b.length - 2; i >= 0; --i) {\n            s += (max + b[i]).toString().substring(1);\n        }\n        return s;\n    };\n    Int10.prototype.valueOf = function () {\n        var b = this.buf;\n        var v = 0;\n        for (var i = b.length - 1; i >= 0; --i) {\n            v = v * max + b[i];\n        }\n        return v;\n    };\n    Int10.prototype.simplify = function () {\n        var b = this.buf;\n        return (b.length == 1) ? b[0] : this;\n    };\n    return Int10;\n}());\nexport { Int10 };\n","// ASN.1 JavaScript decoder\n// Copyright (c) 2008-2014 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\n/*global oids */\nimport { Int10 } from \"./int10\";\nvar ellipsis = \"\\u2026\";\nvar reTimeS = /^(\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\nvar reTimeL = /^(\\d\\d\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\nfunction stringCut(str, len) {\n    if (str.length > len) {\n        str = str.substring(0, len) + ellipsis;\n    }\n    return str;\n}\nvar Stream = /** @class */ (function () {\n    function Stream(enc, pos) {\n        this.hexDigits = \"0123456789ABCDEF\";\n        if (enc instanceof Stream) {\n            this.enc = enc.enc;\n            this.pos = enc.pos;\n        }\n        else {\n            // enc should be an array or a binary string\n            this.enc = enc;\n            this.pos = pos;\n        }\n    }\n    Stream.prototype.get = function (pos) {\n        if (pos === undefined) {\n            pos = this.pos++;\n        }\n        if (pos >= this.enc.length) {\n            throw new Error(\"Requesting byte offset \".concat(pos, \" on a stream of length \").concat(this.enc.length));\n        }\n        return (\"string\" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];\n    };\n    Stream.prototype.hexByte = function (b) {\n        return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);\n    };\n    Stream.prototype.hexDump = function (start, end, raw) {\n        var s = \"\";\n        for (var i = start; i < end; ++i) {\n            s += this.hexByte(this.get(i));\n            if (raw !== true) {\n                switch (i & 0xF) {\n                    case 0x7:\n                        s += \"  \";\n                        break;\n                    case 0xF:\n                        s += \"\\n\";\n                        break;\n                    default:\n                        s += \" \";\n                }\n            }\n        }\n        return s;\n    };\n    Stream.prototype.isASCII = function (start, end) {\n        for (var i = start; i < end; ++i) {\n            var c = this.get(i);\n            if (c < 32 || c > 176) {\n                return false;\n            }\n        }\n        return true;\n    };\n    Stream.prototype.parseStringISO = function (start, end) {\n        var s = \"\";\n        for (var i = start; i < end; ++i) {\n            s += String.fromCharCode(this.get(i));\n        }\n        return s;\n    };\n    Stream.prototype.parseStringUTF = function (start, end) {\n        var s = \"\";\n        for (var i = start; i < end;) {\n            var c = this.get(i++);\n            if (c < 128) {\n                s += String.fromCharCode(c);\n            }\n            else if ((c > 191) && (c < 224)) {\n                s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));\n            }\n            else {\n                s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F));\n            }\n        }\n        return s;\n    };\n    Stream.prototype.parseStringBMP = function (start, end) {\n        var str = \"\";\n        var hi;\n        var lo;\n        for (var i = start; i < end;) {\n            hi = this.get(i++);\n            lo = this.get(i++);\n            str += String.fromCharCode((hi << 8) | lo);\n        }\n        return str;\n    };\n    Stream.prototype.parseTime = function (start, end, shortYear) {\n        var s = this.parseStringISO(start, end);\n        var m = (shortYear ? reTimeS : reTimeL).exec(s);\n        if (!m) {\n            return \"Unrecognized time: \" + s;\n        }\n        if (shortYear) {\n            // to avoid querying the timer, use the fixed range [1970, 2069]\n            // it will conform with ITU X.400 [-10, +40] sliding window until 2030\n            m[1] = +m[1];\n            m[1] += (+m[1] < 70) ? 2000 : 1900;\n        }\n        s = m[1] + \"-\" + m[2] + \"-\" + m[3] + \" \" + m[4];\n        if (m[5]) {\n            s += \":\" + m[5];\n            if (m[6]) {\n                s += \":\" + m[6];\n                if (m[7]) {\n                    s += \".\" + m[7];\n                }\n            }\n        }\n        if (m[8]) {\n            s += \" UTC\";\n            if (m[8] != \"Z\") {\n                s += m[8];\n                if (m[9]) {\n                    s += \":\" + m[9];\n                }\n            }\n        }\n        return s;\n    };\n    Stream.prototype.parseInteger = function (start, end) {\n        var v = this.get(start);\n        var neg = (v > 127);\n        var pad = neg ? 255 : 0;\n        var len;\n        var s = \"\";\n        // skip unuseful bits (not allowed in DER)\n        while (v == pad && ++start < end) {\n            v = this.get(start);\n        }\n        len = end - start;\n        if (len === 0) {\n            return neg ? -1 : 0;\n        }\n        // show bit length of huge integers\n        if (len > 4) {\n            s = v;\n            len <<= 3;\n            while (((+s ^ pad) & 0x80) == 0) {\n                s = +s << 1;\n                --len;\n            }\n            s = \"(\" + len + \" bit)\\n\";\n        }\n        // decode the integer\n        if (neg) {\n            v = v - 256;\n        }\n        var n = new Int10(v);\n        for (var i = start + 1; i < end; ++i) {\n            n.mulAdd(256, this.get(i));\n        }\n        return s + n.toString();\n    };\n    Stream.prototype.parseBitString = function (start, end, maxLength) {\n        var unusedBit = this.get(start);\n        var lenBit = ((end - start - 1) << 3) - unusedBit;\n        var intro = \"(\" + lenBit + \" bit)\\n\";\n        var s = \"\";\n        for (var i = start + 1; i < end; ++i) {\n            var b = this.get(i);\n            var skip = (i == end - 1) ? unusedBit : 0;\n            for (var j = 7; j >= skip; --j) {\n                s += (b >> j) & 1 ? \"1\" : \"0\";\n            }\n            if (s.length > maxLength) {\n                return intro + stringCut(s, maxLength);\n            }\n        }\n        return intro + s;\n    };\n    Stream.prototype.parseOctetString = function (start, end, maxLength) {\n        if (this.isASCII(start, end)) {\n            return stringCut(this.parseStringISO(start, end), maxLength);\n        }\n        var len = end - start;\n        var s = \"(\" + len + \" byte)\\n\";\n        maxLength /= 2; // we work in bytes\n        if (len > maxLength) {\n            end = start + maxLength;\n        }\n        for (var i = start; i < end; ++i) {\n            s += this.hexByte(this.get(i));\n        }\n        if (len > maxLength) {\n            s += ellipsis;\n        }\n        return s;\n    };\n    Stream.prototype.parseOID = function (start, end, maxLength) {\n        var s = \"\";\n        var n = new Int10();\n        var bits = 0;\n        for (var i = start; i < end; ++i) {\n            var v = this.get(i);\n            n.mulAdd(128, v & 0x7F);\n            bits += 7;\n            if (!(v & 0x80)) { // finished\n                if (s === \"\") {\n                    n = n.simplify();\n                    if (n instanceof Int10) {\n                        n.sub(80);\n                        s = \"2.\" + n.toString();\n                    }\n                    else {\n                        var m = n < 80 ? n < 40 ? 0 : 1 : 2;\n                        s = m + \".\" + (n - m * 40);\n                    }\n                }\n                else {\n                    s += \".\" + n.toString();\n                }\n                if (s.length > maxLength) {\n                    return stringCut(s, maxLength);\n                }\n                n = new Int10();\n                bits = 0;\n            }\n        }\n        if (bits > 0) {\n            s += \".incomplete\";\n        }\n        return s;\n    };\n    return Stream;\n}());\nexport { Stream };\nvar ASN1 = /** @class */ (function () {\n    function ASN1(stream, header, length, tag, sub) {\n        if (!(tag instanceof ASN1Tag)) {\n            throw new Error(\"Invalid tag value.\");\n        }\n        this.stream = stream;\n        this.header = header;\n        this.length = length;\n        this.tag = tag;\n        this.sub = sub;\n    }\n    ASN1.prototype.typeName = function () {\n        switch (this.tag.tagClass) {\n            case 0: // universal\n                switch (this.tag.tagNumber) {\n                    case 0x00:\n                        return \"EOC\";\n                    case 0x01:\n                        return \"BOOLEAN\";\n                    case 0x02:\n                        return \"INTEGER\";\n                    case 0x03:\n                        return \"BIT_STRING\";\n                    case 0x04:\n                        return \"OCTET_STRING\";\n                    case 0x05:\n                        return \"NULL\";\n                    case 0x06:\n                        return \"OBJECT_IDENTIFIER\";\n                    case 0x07:\n                        return \"ObjectDescriptor\";\n                    case 0x08:\n                        return \"EXTERNAL\";\n                    case 0x09:\n                        return \"REAL\";\n                    case 0x0A:\n                        return \"ENUMERATED\";\n                    case 0x0B:\n                        return \"EMBEDDED_PDV\";\n                    case 0x0C:\n                        return \"UTF8String\";\n                    case 0x10:\n                        return \"SEQUENCE\";\n                    case 0x11:\n                        return \"SET\";\n                    case 0x12:\n                        return \"NumericString\";\n                    case 0x13:\n                        return \"PrintableString\"; // ASCII subset\n                    case 0x14:\n                        return \"TeletexString\"; // aka T61String\n                    case 0x15:\n                        return \"VideotexString\";\n                    case 0x16:\n                        return \"IA5String\"; // ASCII\n                    case 0x17:\n                        return \"UTCTime\";\n                    case 0x18:\n                        return \"GeneralizedTime\";\n                    case 0x19:\n                        return \"GraphicString\";\n                    case 0x1A:\n                        return \"VisibleString\"; // ASCII subset\n                    case 0x1B:\n                        return \"GeneralString\";\n                    case 0x1C:\n                        return \"UniversalString\";\n                    case 0x1E:\n                        return \"BMPString\";\n                }\n                return \"Universal_\" + this.tag.tagNumber.toString();\n            case 1:\n                return \"Application_\" + this.tag.tagNumber.toString();\n            case 2:\n                return \"[\" + this.tag.tagNumber.toString() + \"]\"; // Context\n            case 3:\n                return \"Private_\" + this.tag.tagNumber.toString();\n        }\n    };\n    ASN1.prototype.content = function (maxLength) {\n        if (this.tag === undefined) {\n            return null;\n        }\n        if (maxLength === undefined) {\n            maxLength = Infinity;\n        }\n        var content = this.posContent();\n        var len = Math.abs(this.length);\n        if (!this.tag.isUniversal()) {\n            if (this.sub !== null) {\n                return \"(\" + this.sub.length + \" elem)\";\n            }\n            return this.stream.parseOctetString(content, content + len, maxLength);\n        }\n        switch (this.tag.tagNumber) {\n            case 0x01: // BOOLEAN\n                return (this.stream.get(content) === 0) ? \"false\" : \"true\";\n            case 0x02: // INTEGER\n                return this.stream.parseInteger(content, content + len);\n            case 0x03: // BIT_STRING\n                return this.sub ? \"(\" + this.sub.length + \" elem)\" :\n                    this.stream.parseBitString(content, content + len, maxLength);\n            case 0x04: // OCTET_STRING\n                return this.sub ? \"(\" + this.sub.length + \" elem)\" :\n                    this.stream.parseOctetString(content, content + len, maxLength);\n            // case 0x05: // NULL\n            case 0x06: // OBJECT_IDENTIFIER\n                return this.stream.parseOID(content, content + len, maxLength);\n            // case 0x07: // ObjectDescriptor\n            // case 0x08: // EXTERNAL\n            // case 0x09: // REAL\n            // case 0x0A: // ENUMERATED\n            // case 0x0B: // EMBEDDED_PDV\n            case 0x10: // SEQUENCE\n            case 0x11: // SET\n                if (this.sub !== null) {\n                    return \"(\" + this.sub.length + \" elem)\";\n                }\n                else {\n                    return \"(no elem)\";\n                }\n            case 0x0C: // UTF8String\n                return stringCut(this.stream.parseStringUTF(content, content + len), maxLength);\n            case 0x12: // NumericString\n            case 0x13: // PrintableString\n            case 0x14: // TeletexString\n            case 0x15: // VideotexString\n            case 0x16: // IA5String\n            // case 0x19: // GraphicString\n            case 0x1A: // VisibleString\n                // case 0x1B: // GeneralString\n                // case 0x1C: // UniversalString\n                return stringCut(this.stream.parseStringISO(content, content + len), maxLength);\n            case 0x1E: // BMPString\n                return stringCut(this.stream.parseStringBMP(content, content + len), maxLength);\n            case 0x17: // UTCTime\n            case 0x18: // GeneralizedTime\n                return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17));\n        }\n        return null;\n    };\n    ASN1.prototype.toString = function () {\n        return this.typeName() + \"@\" + this.stream.pos + \"[header:\" + this.header + \",length:\" + this.length + \",sub:\" + ((this.sub === null) ? \"null\" : this.sub.length) + \"]\";\n    };\n    ASN1.prototype.toPrettyString = function (indent) {\n        if (indent === undefined) {\n            indent = \"\";\n        }\n        var s = indent + this.typeName() + \" @\" + this.stream.pos;\n        if (this.length >= 0) {\n            s += \"+\";\n        }\n        s += this.length;\n        if (this.tag.tagConstructed) {\n            s += \" (constructed)\";\n        }\n        else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null)) {\n            s += \" (encapsulates)\";\n        }\n        s += \"\\n\";\n        if (this.sub !== null) {\n            indent += \"  \";\n            for (var i = 0, max = this.sub.length; i < max; ++i) {\n                s += this.sub[i].toPrettyString(indent);\n            }\n        }\n        return s;\n    };\n    ASN1.prototype.posStart = function () {\n        return this.stream.pos;\n    };\n    ASN1.prototype.posContent = function () {\n        return this.stream.pos + this.header;\n    };\n    ASN1.prototype.posEnd = function () {\n        return this.stream.pos + this.header + Math.abs(this.length);\n    };\n    ASN1.prototype.toHexString = function () {\n        return this.stream.hexDump(this.posStart(), this.posEnd(), true);\n    };\n    ASN1.decodeLength = function (stream) {\n        var buf = stream.get();\n        var len = buf & 0x7F;\n        if (len == buf) {\n            return len;\n        }\n        // no reason to use Int10, as it would be a huge buffer anyways\n        if (len > 6) {\n            throw new Error(\"Length over 48 bits not supported at position \" + (stream.pos - 1));\n        }\n        if (len === 0) {\n            return null;\n        } // undefined\n        buf = 0;\n        for (var i = 0; i < len; ++i) {\n            buf = (buf * 256) + stream.get();\n        }\n        return buf;\n    };\n    /**\n     * Retrieve the hexadecimal value (as a string) of the current ASN.1 element\n     * @returns {string}\n     * @public\n     */\n    ASN1.prototype.getHexStringValue = function () {\n        var hexString = this.toHexString();\n        var offset = this.header * 2;\n        var length = this.length * 2;\n        return hexString.substring(offset, offset + length);\n    };\n    ASN1.decode = function (str) {\n        var stream;\n        if (!(str instanceof Stream)) {\n            stream = new Stream(str, 0);\n        }\n        else {\n            stream = str;\n        }\n        var streamStart = new Stream(stream);\n        var tag = new ASN1Tag(stream);\n        var len = ASN1.decodeLength(stream);\n        var start = stream.pos;\n        var header = start - streamStart.pos;\n        var sub = null;\n        var getSub = function () {\n            var ret = [];\n            if (len !== null) {\n                // definite length\n                var end = start + len;\n                while (stream.pos < end) {\n                    ret[ret.length] = ASN1.decode(stream);\n                }\n                if (stream.pos != end) {\n                    throw new Error(\"Content size is not correct for container starting at offset \" + start);\n                }\n            }\n            else {\n                // undefined length\n                try {\n                    for (;;) {\n                        var s = ASN1.decode(stream);\n                        if (s.tag.isEOC()) {\n                            break;\n                        }\n                        ret[ret.length] = s;\n                    }\n                    len = start - stream.pos; // undefined lengths are represented as negative values\n                }\n                catch (e) {\n                    throw new Error(\"Exception while decoding undefined length content: \" + e);\n                }\n            }\n            return ret;\n        };\n        if (tag.tagConstructed) {\n            // must have valid content\n            sub = getSub();\n        }\n        else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == 0x04))) {\n            // sometimes BitString and OctetString are used to encapsulate ASN.1\n            try {\n                if (tag.tagNumber == 0x03) {\n                    if (stream.get() != 0) {\n                        throw new Error(\"BIT STRINGs with unused bits cannot encapsulate.\");\n                    }\n                }\n                sub = getSub();\n                for (var i = 0; i < sub.length; ++i) {\n                    if (sub[i].tag.isEOC()) {\n                        throw new Error(\"EOC is not supposed to be actual content.\");\n                    }\n                }\n            }\n            catch (e) {\n                // but silently ignore when they don't\n                sub = null;\n            }\n        }\n        if (sub === null) {\n            if (len === null) {\n                throw new Error(\"We can't skip over an invalid tag with undefined length at offset \" + start);\n            }\n            stream.pos = start + Math.abs(len);\n        }\n        return new ASN1(streamStart, header, len, tag, sub);\n    };\n    return ASN1;\n}());\nexport { ASN1 };\nvar ASN1Tag = /** @class */ (function () {\n    function ASN1Tag(stream) {\n        var buf = stream.get();\n        this.tagClass = buf >> 6;\n        this.tagConstructed = ((buf & 0x20) !== 0);\n        this.tagNumber = buf & 0x1F;\n        if (this.tagNumber == 0x1F) { // long tag\n            var n = new Int10();\n            do {\n                buf = stream.get();\n                n.mulAdd(128, buf & 0x7F);\n            } while (buf & 0x80);\n            this.tagNumber = n.simplify();\n        }\n    }\n    ASN1Tag.prototype.isUniversal = function () {\n        return this.tagClass === 0x00;\n    };\n    ASN1Tag.prototype.isEOC = function () {\n        return this.tagClass === 0x00 && this.tagNumber === 0x00;\n    };\n    return ASN1Tag;\n}());\nexport { ASN1Tag };\n","// Copyright (c) 2005  Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n// Basic JavaScript BN library - subset useful for RSA encryption.\nimport { cbit, int2char, lbit, op_and, op_andnot, op_or, op_xor } from \"./util\";\n// Bits per digit\nvar dbits;\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary & 0xffffff) == 0xefcafe);\n//#region\nvar lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];\nvar lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\n//#endregion\n// (public) Constructor\nvar BigInteger = /** @class */ (function () {\n    function BigInteger(a, b, c) {\n        if (a != null) {\n            if (\"number\" == typeof a) {\n                this.fromNumber(a, b, c);\n            }\n            else if (b == null && \"string\" != typeof a) {\n                this.fromString(a, 256);\n            }\n            else {\n                this.fromString(a, b);\n            }\n        }\n    }\n    //#region PUBLIC\n    // BigInteger.prototype.toString = bnToString;\n    // (public) return string representation in given radix\n    BigInteger.prototype.toString = function (b) {\n        if (this.s < 0) {\n            return \"-\" + this.negate().toString(b);\n        }\n        var k;\n        if (b == 16) {\n            k = 4;\n        }\n        else if (b == 8) {\n            k = 3;\n        }\n        else if (b == 2) {\n            k = 1;\n        }\n        else if (b == 32) {\n            k = 5;\n        }\n        else if (b == 4) {\n            k = 2;\n        }\n        else {\n            return this.toRadix(b);\n        }\n        var km = (1 << k) - 1;\n        var d;\n        var m = false;\n        var r = \"\";\n        var i = this.t;\n        var p = this.DB - (i * this.DB) % k;\n        if (i-- > 0) {\n            if (p < this.DB && (d = this[i] >> p) > 0) {\n                m = true;\n                r = int2char(d);\n            }\n            while (i >= 0) {\n                if (p < k) {\n                    d = (this[i] & ((1 << p) - 1)) << (k - p);\n                    d |= this[--i] >> (p += this.DB - k);\n                }\n                else {\n                    d = (this[i] >> (p -= k)) & km;\n                    if (p <= 0) {\n                        p += this.DB;\n                        --i;\n                    }\n                }\n                if (d > 0) {\n                    m = true;\n                }\n                if (m) {\n                    r += int2char(d);\n                }\n            }\n        }\n        return m ? r : \"0\";\n    };\n    // BigInteger.prototype.negate = bnNegate;\n    // (public) -this\n    BigInteger.prototype.negate = function () {\n        var r = nbi();\n        BigInteger.ZERO.subTo(this, r);\n        return r;\n    };\n    // BigInteger.prototype.abs = bnAbs;\n    // (public) |this|\n    BigInteger.prototype.abs = function () {\n        return (this.s < 0) ? this.negate() : this;\n    };\n    // BigInteger.prototype.compareTo = bnCompareTo;\n    // (public) return + if this > a, - if this < a, 0 if equal\n    BigInteger.prototype.compareTo = function (a) {\n        var r = this.s - a.s;\n        if (r != 0) {\n            return r;\n        }\n        var i = this.t;\n        r = i - a.t;\n        if (r != 0) {\n            return (this.s < 0) ? -r : r;\n        }\n        while (--i >= 0) {\n            if ((r = this[i] - a[i]) != 0) {\n                return r;\n            }\n        }\n        return 0;\n    };\n    // BigInteger.prototype.bitLength = bnBitLength;\n    // (public) return the number of bits in \"this\"\n    BigInteger.prototype.bitLength = function () {\n        if (this.t <= 0) {\n            return 0;\n        }\n        return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));\n    };\n    // BigInteger.prototype.mod = bnMod;\n    // (public) this mod a\n    BigInteger.prototype.mod = function (a) {\n        var r = nbi();\n        this.abs().divRemTo(a, null, r);\n        if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {\n            a.subTo(r, r);\n        }\n        return r;\n    };\n    // BigInteger.prototype.modPowInt = bnModPowInt;\n    // (public) this^e % m, 0 <= e < 2^32\n    BigInteger.prototype.modPowInt = function (e, m) {\n        var z;\n        if (e < 256 || m.isEven()) {\n            z = new Classic(m);\n        }\n        else {\n            z = new Montgomery(m);\n        }\n        return this.exp(e, z);\n    };\n    // BigInteger.prototype.clone = bnClone;\n    // (public)\n    BigInteger.prototype.clone = function () {\n        var r = nbi();\n        this.copyTo(r);\n        return r;\n    };\n    // BigInteger.prototype.intValue = bnIntValue;\n    // (public) return value as integer\n    BigInteger.prototype.intValue = function () {\n        if (this.s < 0) {\n            if (this.t == 1) {\n                return this[0] - this.DV;\n            }\n            else if (this.t == 0) {\n                return -1;\n            }\n        }\n        else if (this.t == 1) {\n            return this[0];\n        }\n        else if (this.t == 0) {\n            return 0;\n        }\n        // assumes 16 < DB < 32\n        return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];\n    };\n    // BigInteger.prototype.byteValue = bnByteValue;\n    // (public) return value as byte\n    BigInteger.prototype.byteValue = function () {\n        return (this.t == 0) ? this.s : (this[0] << 24) >> 24;\n    };\n    // BigInteger.prototype.shortValue = bnShortValue;\n    // (public) return value as short (assumes DB>=16)\n    BigInteger.prototype.shortValue = function () {\n        return (this.t == 0) ? this.s : (this[0] << 16) >> 16;\n    };\n    // BigInteger.prototype.signum = bnSigNum;\n    // (public) 0 if this == 0, 1 if this > 0\n    BigInteger.prototype.signum = function () {\n        if (this.s < 0) {\n            return -1;\n        }\n        else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {\n            return 0;\n        }\n        else {\n            return 1;\n        }\n    };\n    // BigInteger.prototype.toByteArray = bnToByteArray;\n    // (public) convert to bigendian byte array\n    BigInteger.prototype.toByteArray = function () {\n        var i = this.t;\n        var r = [];\n        r[0] = this.s;\n        var p = this.DB - (i * this.DB) % 8;\n        var d;\n        var k = 0;\n        if (i-- > 0) {\n            if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) {\n                r[k++] = d | (this.s << (this.DB - p));\n            }\n            while (i >= 0) {\n                if (p < 8) {\n                    d = (this[i] & ((1 << p) - 1)) << (8 - p);\n                    d |= this[--i] >> (p += this.DB - 8);\n                }\n                else {\n                    d = (this[i] >> (p -= 8)) & 0xff;\n                    if (p <= 0) {\n                        p += this.DB;\n                        --i;\n                    }\n                }\n                if ((d & 0x80) != 0) {\n                    d |= -256;\n                }\n                if (k == 0 && (this.s & 0x80) != (d & 0x80)) {\n                    ++k;\n                }\n                if (k > 0 || d != this.s) {\n                    r[k++] = d;\n                }\n            }\n        }\n        return r;\n    };\n    // BigInteger.prototype.equals = bnEquals;\n    BigInteger.prototype.equals = function (a) {\n        return (this.compareTo(a) == 0);\n    };\n    // BigInteger.prototype.min = bnMin;\n    BigInteger.prototype.min = function (a) {\n        return (this.compareTo(a) < 0) ? this : a;\n    };\n    // BigInteger.prototype.max = bnMax;\n    BigInteger.prototype.max = function (a) {\n        return (this.compareTo(a) > 0) ? this : a;\n    };\n    // BigInteger.prototype.and = bnAnd;\n    BigInteger.prototype.and = function (a) {\n        var r = nbi();\n        this.bitwiseTo(a, op_and, r);\n        return r;\n    };\n    // BigInteger.prototype.or = bnOr;\n    BigInteger.prototype.or = function (a) {\n        var r = nbi();\n        this.bitwiseTo(a, op_or, r);\n        return r;\n    };\n    // BigInteger.prototype.xor = bnXor;\n    BigInteger.prototype.xor = function (a) {\n        var r = nbi();\n        this.bitwiseTo(a, op_xor, r);\n        return r;\n    };\n    // BigInteger.prototype.andNot = bnAndNot;\n    BigInteger.prototype.andNot = function (a) {\n        var r = nbi();\n        this.bitwiseTo(a, op_andnot, r);\n        return r;\n    };\n    // BigInteger.prototype.not = bnNot;\n    // (public) ~this\n    BigInteger.prototype.not = function () {\n        var r = nbi();\n        for (var i = 0; i < this.t; ++i) {\n            r[i] = this.DM & ~this[i];\n        }\n        r.t = this.t;\n        r.s = ~this.s;\n        return r;\n    };\n    // BigInteger.prototype.shiftLeft = bnShiftLeft;\n    // (public) this << n\n    BigInteger.prototype.shiftLeft = function (n) {\n        var r = nbi();\n        if (n < 0) {\n            this.rShiftTo(-n, r);\n        }\n        else {\n            this.lShiftTo(n, r);\n        }\n        return r;\n    };\n    // BigInteger.prototype.shiftRight = bnShiftRight;\n    // (public) this >> n\n    BigInteger.prototype.shiftRight = function (n) {\n        var r = nbi();\n        if (n < 0) {\n            this.lShiftTo(-n, r);\n        }\n        else {\n            this.rShiftTo(n, r);\n        }\n        return r;\n    };\n    // BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n    // (public) returns index of lowest 1-bit (or -1 if none)\n    BigInteger.prototype.getLowestSetBit = function () {\n        for (var i = 0; i < this.t; ++i) {\n            if (this[i] != 0) {\n                return i * this.DB + lbit(this[i]);\n            }\n        }\n        if (this.s < 0) {\n            return this.t * this.DB;\n        }\n        return -1;\n    };\n    // BigInteger.prototype.bitCount = bnBitCount;\n    // (public) return number of set bits\n    BigInteger.prototype.bitCount = function () {\n        var r = 0;\n        var x = this.s & this.DM;\n        for (var i = 0; i < this.t; ++i) {\n            r += cbit(this[i] ^ x);\n        }\n        return r;\n    };\n    // BigInteger.prototype.testBit = bnTestBit;\n    // (public) true iff nth bit is set\n    BigInteger.prototype.testBit = function (n) {\n        var j = Math.floor(n / this.DB);\n        if (j >= this.t) {\n            return (this.s != 0);\n        }\n        return ((this[j] & (1 << (n % this.DB))) != 0);\n    };\n    // BigInteger.prototype.setBit = bnSetBit;\n    // (public) this | (1<<n)\n    BigInteger.prototype.setBit = function (n) {\n        return this.changeBit(n, op_or);\n    };\n    // BigInteger.prototype.clearBit = bnClearBit;\n    // (public) this & ~(1<<n)\n    BigInteger.prototype.clearBit = function (n) {\n        return this.changeBit(n, op_andnot);\n    };\n    // BigInteger.prototype.flipBit = bnFlipBit;\n    // (public) this ^ (1<<n)\n    BigInteger.prototype.flipBit = function (n) {\n        return this.changeBit(n, op_xor);\n    };\n    // BigInteger.prototype.add = bnAdd;\n    // (public) this + a\n    BigInteger.prototype.add = function (a) {\n        var r = nbi();\n        this.addTo(a, r);\n        return r;\n    };\n    // BigInteger.prototype.subtract = bnSubtract;\n    // (public) this - a\n    BigInteger.prototype.subtract = function (a) {\n        var r = nbi();\n        this.subTo(a, r);\n        return r;\n    };\n    // BigInteger.prototype.multiply = bnMultiply;\n    // (public) this * a\n    BigInteger.prototype.multiply = function (a) {\n        var r = nbi();\n        this.multiplyTo(a, r);\n        return r;\n    };\n    // BigInteger.prototype.divide = bnDivide;\n    // (public) this / a\n    BigInteger.prototype.divide = function (a) {\n        var r = nbi();\n        this.divRemTo(a, r, null);\n        return r;\n    };\n    // BigInteger.prototype.remainder = bnRemainder;\n    // (public) this % a\n    BigInteger.prototype.remainder = function (a) {\n        var r = nbi();\n        this.divRemTo(a, null, r);\n        return r;\n    };\n    // BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n    // (public) [this/a,this%a]\n    BigInteger.prototype.divideAndRemainder = function (a) {\n        var q = nbi();\n        var r = nbi();\n        this.divRemTo(a, q, r);\n        return [q, r];\n    };\n    // BigInteger.prototype.modPow = bnModPow;\n    // (public) this^e % m (HAC 14.85)\n    BigInteger.prototype.modPow = function (e, m) {\n        var i = e.bitLength();\n        var k;\n        var r = nbv(1);\n        var z;\n        if (i <= 0) {\n            return r;\n        }\n        else if (i < 18) {\n            k = 1;\n        }\n        else if (i < 48) {\n            k = 3;\n        }\n        else if (i < 144) {\n            k = 4;\n        }\n        else if (i < 768) {\n            k = 5;\n        }\n        else {\n            k = 6;\n        }\n        if (i < 8) {\n            z = new Classic(m);\n        }\n        else if (m.isEven()) {\n            z = new Barrett(m);\n        }\n        else {\n            z = new Montgomery(m);\n        }\n        // precomputation\n        var g = [];\n        var n = 3;\n        var k1 = k - 1;\n        var km = (1 << k) - 1;\n        g[1] = z.convert(this);\n        if (k > 1) {\n            var g2 = nbi();\n            z.sqrTo(g[1], g2);\n            while (n <= km) {\n                g[n] = nbi();\n                z.mulTo(g2, g[n - 2], g[n]);\n                n += 2;\n            }\n        }\n        var j = e.t - 1;\n        var w;\n        var is1 = true;\n        var r2 = nbi();\n        var t;\n        i = nbits(e[j]) - 1;\n        while (j >= 0) {\n            if (i >= k1) {\n                w = (e[j] >> (i - k1)) & km;\n            }\n            else {\n                w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);\n                if (j > 0) {\n                    w |= e[j - 1] >> (this.DB + i - k1);\n                }\n            }\n            n = k;\n            while ((w & 1) == 0) {\n                w >>= 1;\n                --n;\n            }\n            if ((i -= n) < 0) {\n                i += this.DB;\n                --j;\n            }\n            if (is1) { // ret == 1, don't bother squaring or multiplying it\n                g[w].copyTo(r);\n                is1 = false;\n            }\n            else {\n                while (n > 1) {\n                    z.sqrTo(r, r2);\n                    z.sqrTo(r2, r);\n                    n -= 2;\n                }\n                if (n > 0) {\n                    z.sqrTo(r, r2);\n                }\n                else {\n                    t = r;\n                    r = r2;\n                    r2 = t;\n                }\n                z.mulTo(r2, g[w], r);\n            }\n            while (j >= 0 && (e[j] & (1 << i)) == 0) {\n                z.sqrTo(r, r2);\n                t = r;\n                r = r2;\n                r2 = t;\n                if (--i < 0) {\n                    i = this.DB - 1;\n                    --j;\n                }\n            }\n        }\n        return z.revert(r);\n    };\n    // BigInteger.prototype.modInverse = bnModInverse;\n    // (public) 1/this % m (HAC 14.61)\n    BigInteger.prototype.modInverse = function (m) {\n        var ac = m.isEven();\n        if ((this.isEven() && ac) || m.signum() == 0) {\n            return BigInteger.ZERO;\n        }\n        var u = m.clone();\n        var v = this.clone();\n        var a = nbv(1);\n        var b = nbv(0);\n        var c = nbv(0);\n        var d = nbv(1);\n        while (u.signum() != 0) {\n            while (u.isEven()) {\n                u.rShiftTo(1, u);\n                if (ac) {\n                    if (!a.isEven() || !b.isEven()) {\n                        a.addTo(this, a);\n                        b.subTo(m, b);\n                    }\n                    a.rShiftTo(1, a);\n                }\n                else if (!b.isEven()) {\n                    b.subTo(m, b);\n                }\n                b.rShiftTo(1, b);\n            }\n            while (v.isEven()) {\n                v.rShiftTo(1, v);\n                if (ac) {\n                    if (!c.isEven() || !d.isEven()) {\n                        c.addTo(this, c);\n                        d.subTo(m, d);\n                    }\n                    c.rShiftTo(1, c);\n                }\n                else if (!d.isEven()) {\n                    d.subTo(m, d);\n                }\n                d.rShiftTo(1, d);\n            }\n            if (u.compareTo(v) >= 0) {\n                u.subTo(v, u);\n                if (ac) {\n                    a.subTo(c, a);\n                }\n                b.subTo(d, b);\n            }\n            else {\n                v.subTo(u, v);\n                if (ac) {\n                    c.subTo(a, c);\n                }\n                d.subTo(b, d);\n            }\n        }\n        if (v.compareTo(BigInteger.ONE) != 0) {\n            return BigInteger.ZERO;\n        }\n        if (d.compareTo(m) >= 0) {\n            return d.subtract(m);\n        }\n        if (d.signum() < 0) {\n            d.addTo(m, d);\n        }\n        else {\n            return d;\n        }\n        if (d.signum() < 0) {\n            return d.add(m);\n        }\n        else {\n            return d;\n        }\n    };\n    // BigInteger.prototype.pow = bnPow;\n    // (public) this^e\n    BigInteger.prototype.pow = function (e) {\n        return this.exp(e, new NullExp());\n    };\n    // BigInteger.prototype.gcd = bnGCD;\n    // (public) gcd(this,a) (HAC 14.54)\n    BigInteger.prototype.gcd = function (a) {\n        var x = (this.s < 0) ? this.negate() : this.clone();\n        var y = (a.s < 0) ? a.negate() : a.clone();\n        if (x.compareTo(y) < 0) {\n            var t = x;\n            x = y;\n            y = t;\n        }\n        var i = x.getLowestSetBit();\n        var g = y.getLowestSetBit();\n        if (g < 0) {\n            return x;\n        }\n        if (i < g) {\n            g = i;\n        }\n        if (g > 0) {\n            x.rShiftTo(g, x);\n            y.rShiftTo(g, y);\n        }\n        while (x.signum() > 0) {\n            if ((i = x.getLowestSetBit()) > 0) {\n                x.rShiftTo(i, x);\n            }\n            if ((i = y.getLowestSetBit()) > 0) {\n                y.rShiftTo(i, y);\n            }\n            if (x.compareTo(y) >= 0) {\n                x.subTo(y, x);\n                x.rShiftTo(1, x);\n            }\n            else {\n                y.subTo(x, y);\n                y.rShiftTo(1, y);\n            }\n        }\n        if (g > 0) {\n            y.lShiftTo(g, y);\n        }\n        return y;\n    };\n    // BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n    // (public) test primality with certainty >= 1-.5^t\n    BigInteger.prototype.isProbablePrime = function (t) {\n        var i;\n        var x = this.abs();\n        if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {\n            for (i = 0; i < lowprimes.length; ++i) {\n                if (x[0] == lowprimes[i]) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        if (x.isEven()) {\n            return false;\n        }\n        i = 1;\n        while (i < lowprimes.length) {\n            var m = lowprimes[i];\n            var j = i + 1;\n            while (j < lowprimes.length && m < lplim) {\n                m *= lowprimes[j++];\n            }\n            m = x.modInt(m);\n            while (i < j) {\n                if (m % lowprimes[i++] == 0) {\n                    return false;\n                }\n            }\n        }\n        return x.millerRabin(t);\n    };\n    //#endregion PUBLIC\n    //#region PROTECTED\n    // BigInteger.prototype.copyTo = bnpCopyTo;\n    // (protected) copy this to r\n    BigInteger.prototype.copyTo = function (r) {\n        for (var i = this.t - 1; i >= 0; --i) {\n            r[i] = this[i];\n        }\n        r.t = this.t;\n        r.s = this.s;\n    };\n    // BigInteger.prototype.fromInt = bnpFromInt;\n    // (protected) set from integer value x, -DV <= x < DV\n    BigInteger.prototype.fromInt = function (x) {\n        this.t = 1;\n        this.s = (x < 0) ? -1 : 0;\n        if (x > 0) {\n            this[0] = x;\n        }\n        else if (x < -1) {\n            this[0] = x + this.DV;\n        }\n        else {\n            this.t = 0;\n        }\n    };\n    // BigInteger.prototype.fromString = bnpFromString;\n    // (protected) set from string and radix\n    BigInteger.prototype.fromString = function (s, b) {\n        var k;\n        if (b == 16) {\n            k = 4;\n        }\n        else if (b == 8) {\n            k = 3;\n        }\n        else if (b == 256) {\n            k = 8;\n            /* byte array */\n        }\n        else if (b == 2) {\n            k = 1;\n        }\n        else if (b == 32) {\n            k = 5;\n        }\n        else if (b == 4) {\n            k = 2;\n        }\n        else {\n            this.fromRadix(s, b);\n            return;\n        }\n        this.t = 0;\n        this.s = 0;\n        var i = s.length;\n        var mi = false;\n        var sh = 0;\n        while (--i >= 0) {\n            var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i);\n            if (x < 0) {\n                if (s.charAt(i) == \"-\") {\n                    mi = true;\n                }\n                continue;\n            }\n            mi = false;\n            if (sh == 0) {\n                this[this.t++] = x;\n            }\n            else if (sh + k > this.DB) {\n                this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;\n                this[this.t++] = (x >> (this.DB - sh));\n            }\n            else {\n                this[this.t - 1] |= x << sh;\n            }\n            sh += k;\n            if (sh >= this.DB) {\n                sh -= this.DB;\n            }\n        }\n        if (k == 8 && ((+s[0]) & 0x80) != 0) {\n            this.s = -1;\n            if (sh > 0) {\n                this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;\n            }\n        }\n        this.clamp();\n        if (mi) {\n            BigInteger.ZERO.subTo(this, this);\n        }\n    };\n    // BigInteger.prototype.clamp = bnpClamp;\n    // (protected) clamp off excess high words\n    BigInteger.prototype.clamp = function () {\n        var c = this.s & this.DM;\n        while (this.t > 0 && this[this.t - 1] == c) {\n            --this.t;\n        }\n    };\n    // BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n    // (protected) r = this << n*DB\n    BigInteger.prototype.dlShiftTo = function (n, r) {\n        var i;\n        for (i = this.t - 1; i >= 0; --i) {\n            r[i + n] = this[i];\n        }\n        for (i = n - 1; i >= 0; --i) {\n            r[i] = 0;\n        }\n        r.t = this.t + n;\n        r.s = this.s;\n    };\n    // BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n    // (protected) r = this >> n*DB\n    BigInteger.prototype.drShiftTo = function (n, r) {\n        for (var i = n; i < this.t; ++i) {\n            r[i - n] = this[i];\n        }\n        r.t = Math.max(this.t - n, 0);\n        r.s = this.s;\n    };\n    // BigInteger.prototype.lShiftTo = bnpLShiftTo;\n    // (protected) r = this << n\n    BigInteger.prototype.lShiftTo = function (n, r) {\n        var bs = n % this.DB;\n        var cbs = this.DB - bs;\n        var bm = (1 << cbs) - 1;\n        var ds = Math.floor(n / this.DB);\n        var c = (this.s << bs) & this.DM;\n        for (var i = this.t - 1; i >= 0; --i) {\n            r[i + ds + 1] = (this[i] >> cbs) | c;\n            c = (this[i] & bm) << bs;\n        }\n        for (var i = ds - 1; i >= 0; --i) {\n            r[i] = 0;\n        }\n        r[ds] = c;\n        r.t = this.t + ds + 1;\n        r.s = this.s;\n        r.clamp();\n    };\n    // BigInteger.prototype.rShiftTo = bnpRShiftTo;\n    // (protected) r = this >> n\n    BigInteger.prototype.rShiftTo = function (n, r) {\n        r.s = this.s;\n        var ds = Math.floor(n / this.DB);\n        if (ds >= this.t) {\n            r.t = 0;\n            return;\n        }\n        var bs = n % this.DB;\n        var cbs = this.DB - bs;\n        var bm = (1 << bs) - 1;\n        r[0] = this[ds] >> bs;\n        for (var i = ds + 1; i < this.t; ++i) {\n            r[i - ds - 1] |= (this[i] & bm) << cbs;\n            r[i - ds] = this[i] >> bs;\n        }\n        if (bs > 0) {\n            r[this.t - ds - 1] |= (this.s & bm) << cbs;\n        }\n        r.t = this.t - ds;\n        r.clamp();\n    };\n    // BigInteger.prototype.subTo = bnpSubTo;\n    // (protected) r = this - a\n    BigInteger.prototype.subTo = function (a, r) {\n        var i = 0;\n        var c = 0;\n        var m = Math.min(a.t, this.t);\n        while (i < m) {\n            c += this[i] - a[i];\n            r[i++] = c & this.DM;\n            c >>= this.DB;\n        }\n        if (a.t < this.t) {\n            c -= a.s;\n            while (i < this.t) {\n                c += this[i];\n                r[i++] = c & this.DM;\n                c >>= this.DB;\n            }\n            c += this.s;\n        }\n        else {\n            c += this.s;\n            while (i < a.t) {\n                c -= a[i];\n                r[i++] = c & this.DM;\n                c >>= this.DB;\n            }\n            c -= a.s;\n        }\n        r.s = (c < 0) ? -1 : 0;\n        if (c < -1) {\n            r[i++] = this.DV + c;\n        }\n        else if (c > 0) {\n            r[i++] = c;\n        }\n        r.t = i;\n        r.clamp();\n    };\n    // BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n    // (protected) r = this * a, r != this,a (HAC 14.12)\n    // \"this\" should be the larger one if appropriate.\n    BigInteger.prototype.multiplyTo = function (a, r) {\n        var x = this.abs();\n        var y = a.abs();\n        var i = x.t;\n        r.t = i + y.t;\n        while (--i >= 0) {\n            r[i] = 0;\n        }\n        for (i = 0; i < y.t; ++i) {\n            r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);\n        }\n        r.s = 0;\n        r.clamp();\n        if (this.s != a.s) {\n            BigInteger.ZERO.subTo(r, r);\n        }\n    };\n    // BigInteger.prototype.squareTo = bnpSquareTo;\n    // (protected) r = this^2, r != this (HAC 14.16)\n    BigInteger.prototype.squareTo = function (r) {\n        var x = this.abs();\n        var i = r.t = 2 * x.t;\n        while (--i >= 0) {\n            r[i] = 0;\n        }\n        for (i = 0; i < x.t - 1; ++i) {\n            var c = x.am(i, x[i], r, 2 * i, 0, 1);\n            if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {\n                r[i + x.t] -= x.DV;\n                r[i + x.t + 1] = 1;\n            }\n        }\n        if (r.t > 0) {\n            r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);\n        }\n        r.s = 0;\n        r.clamp();\n    };\n    // BigInteger.prototype.divRemTo = bnpDivRemTo;\n    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n    // r != q, this != m.  q or r may be null.\n    BigInteger.prototype.divRemTo = function (m, q, r) {\n        var pm = m.abs();\n        if (pm.t <= 0) {\n            return;\n        }\n        var pt = this.abs();\n        if (pt.t < pm.t) {\n            if (q != null) {\n                q.fromInt(0);\n            }\n            if (r != null) {\n                this.copyTo(r);\n            }\n            return;\n        }\n        if (r == null) {\n            r = nbi();\n        }\n        var y = nbi();\n        var ts = this.s;\n        var ms = m.s;\n        var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus\n        if (nsh > 0) {\n            pm.lShiftTo(nsh, y);\n            pt.lShiftTo(nsh, r);\n        }\n        else {\n            pm.copyTo(y);\n            pt.copyTo(r);\n        }\n        var ys = y.t;\n        var y0 = y[ys - 1];\n        if (y0 == 0) {\n            return;\n        }\n        var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);\n        var d1 = this.FV / yt;\n        var d2 = (1 << this.F1) / yt;\n        var e = 1 << this.F2;\n        var i = r.t;\n        var j = i - ys;\n        var t = (q == null) ? nbi() : q;\n        y.dlShiftTo(j, t);\n        if (r.compareTo(t) >= 0) {\n            r[r.t++] = 1;\n            r.subTo(t, r);\n        }\n        BigInteger.ONE.dlShiftTo(ys, t);\n        t.subTo(y, y); // \"negative\" y so we can replace sub with am later\n        while (y.t < ys) {\n            y[y.t++] = 0;\n        }\n        while (--j >= 0) {\n            // Estimate quotient digit\n            var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);\n            if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out\n                y.dlShiftTo(j, t);\n                r.subTo(t, r);\n                while (r[i] < --qd) {\n                    r.subTo(t, r);\n                }\n            }\n        }\n        if (q != null) {\n            r.drShiftTo(ys, q);\n            if (ts != ms) {\n                BigInteger.ZERO.subTo(q, q);\n            }\n        }\n        r.t = ys;\n        r.clamp();\n        if (nsh > 0) {\n            r.rShiftTo(nsh, r);\n        } // Denormalize remainder\n        if (ts < 0) {\n            BigInteger.ZERO.subTo(r, r);\n        }\n    };\n    // BigInteger.prototype.invDigit = bnpInvDigit;\n    // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n    // justification:\n    //         xy == 1 (mod m)\n    //         xy =  1+km\n    //   xy(2-xy) = (1+km)(1-km)\n    // x[y(2-xy)] = 1-k^2m^2\n    // x[y(2-xy)] == 1 (mod m^2)\n    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n    // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n    BigInteger.prototype.invDigit = function () {\n        if (this.t < 1) {\n            return 0;\n        }\n        var x = this[0];\n        if ((x & 1) == 0) {\n            return 0;\n        }\n        var y = x & 3; // y == 1/x mod 2^2\n        y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4\n        y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8\n        y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16\n        // last step - calculate inverse mod DV directly;\n        // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n        y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits\n        // we really want the negative inverse, and -DV < y < DV\n        return (y > 0) ? this.DV - y : -y;\n    };\n    // BigInteger.prototype.isEven = bnpIsEven;\n    // (protected) true iff this is even\n    BigInteger.prototype.isEven = function () {\n        return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;\n    };\n    // BigInteger.prototype.exp = bnpExp;\n    // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n    BigInteger.prototype.exp = function (e, z) {\n        if (e > 0xffffffff || e < 1) {\n            return BigInteger.ONE;\n        }\n        var r = nbi();\n        var r2 = nbi();\n        var g = z.convert(this);\n        var i = nbits(e) - 1;\n        g.copyTo(r);\n        while (--i >= 0) {\n            z.sqrTo(r, r2);\n            if ((e & (1 << i)) > 0) {\n                z.mulTo(r2, g, r);\n            }\n            else {\n                var t = r;\n                r = r2;\n                r2 = t;\n            }\n        }\n        return z.revert(r);\n    };\n    // BigInteger.prototype.chunkSize = bnpChunkSize;\n    // (protected) return x s.t. r^x < DV\n    BigInteger.prototype.chunkSize = function (r) {\n        return Math.floor(Math.LN2 * this.DB / Math.log(r));\n    };\n    // BigInteger.prototype.toRadix = bnpToRadix;\n    // (protected) convert to radix string\n    BigInteger.prototype.toRadix = function (b) {\n        if (b == null) {\n            b = 10;\n        }\n        if (this.signum() == 0 || b < 2 || b > 36) {\n            return \"0\";\n        }\n        var cs = this.chunkSize(b);\n        var a = Math.pow(b, cs);\n        var d = nbv(a);\n        var y = nbi();\n        var z = nbi();\n        var r = \"\";\n        this.divRemTo(d, y, z);\n        while (y.signum() > 0) {\n            r = (a + z.intValue()).toString(b).substring(1) + r;\n            y.divRemTo(d, y, z);\n        }\n        return z.intValue().toString(b) + r;\n    };\n    // BigInteger.prototype.fromRadix = bnpFromRadix;\n    // (protected) convert from radix string\n    BigInteger.prototype.fromRadix = function (s, b) {\n        this.fromInt(0);\n        if (b == null) {\n            b = 10;\n        }\n        var cs = this.chunkSize(b);\n        var d = Math.pow(b, cs);\n        var mi = false;\n        var j = 0;\n        var w = 0;\n        for (var i = 0; i < s.length; ++i) {\n            var x = intAt(s, i);\n            if (x < 0) {\n                if (s.charAt(i) == \"-\" && this.signum() == 0) {\n                    mi = true;\n                }\n                continue;\n            }\n            w = b * w + x;\n            if (++j >= cs) {\n                this.dMultiply(d);\n                this.dAddOffset(w, 0);\n                j = 0;\n                w = 0;\n            }\n        }\n        if (j > 0) {\n            this.dMultiply(Math.pow(b, j));\n            this.dAddOffset(w, 0);\n        }\n        if (mi) {\n            BigInteger.ZERO.subTo(this, this);\n        }\n    };\n    // BigInteger.prototype.fromNumber = bnpFromNumber;\n    // (protected) alternate constructor\n    BigInteger.prototype.fromNumber = function (a, b, c) {\n        if (\"number\" == typeof b) {\n            // new BigInteger(int,int,RNG)\n            if (a < 2) {\n                this.fromInt(1);\n            }\n            else {\n                this.fromNumber(a, c);\n                if (!this.testBit(a - 1)) {\n                    // force MSB set\n                    this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\n                }\n                if (this.isEven()) {\n                    this.dAddOffset(1, 0);\n                } // force odd\n                while (!this.isProbablePrime(b)) {\n                    this.dAddOffset(2, 0);\n                    if (this.bitLength() > a) {\n                        this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);\n                    }\n                }\n            }\n        }\n        else {\n            // new BigInteger(int,RNG)\n            var x = [];\n            var t = a & 7;\n            x.length = (a >> 3) + 1;\n            b.nextBytes(x);\n            if (t > 0) {\n                x[0] &= ((1 << t) - 1);\n            }\n            else {\n                x[0] = 0;\n            }\n            this.fromString(x, 256);\n        }\n    };\n    // BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n    // (protected) r = this op a (bitwise)\n    BigInteger.prototype.bitwiseTo = function (a, op, r) {\n        var i;\n        var f;\n        var m = Math.min(a.t, this.t);\n        for (i = 0; i < m; ++i) {\n            r[i] = op(this[i], a[i]);\n        }\n        if (a.t < this.t) {\n            f = a.s & this.DM;\n            for (i = m; i < this.t; ++i) {\n                r[i] = op(this[i], f);\n            }\n            r.t = this.t;\n        }\n        else {\n            f = this.s & this.DM;\n            for (i = m; i < a.t; ++i) {\n                r[i] = op(f, a[i]);\n            }\n            r.t = a.t;\n        }\n        r.s = op(this.s, a.s);\n        r.clamp();\n    };\n    // BigInteger.prototype.changeBit = bnpChangeBit;\n    // (protected) this op (1<<n)\n    BigInteger.prototype.changeBit = function (n, op) {\n        var r = BigInteger.ONE.shiftLeft(n);\n        this.bitwiseTo(r, op, r);\n        return r;\n    };\n    // BigInteger.prototype.addTo = bnpAddTo;\n    // (protected) r = this + a\n    BigInteger.prototype.addTo = function (a, r) {\n        var i = 0;\n        var c = 0;\n        var m = Math.min(a.t, this.t);\n        while (i < m) {\n            c += this[i] + a[i];\n            r[i++] = c & this.DM;\n            c >>= this.DB;\n        }\n        if (a.t < this.t) {\n            c += a.s;\n            while (i < this.t) {\n                c += this[i];\n                r[i++] = c & this.DM;\n                c >>= this.DB;\n            }\n            c += this.s;\n        }\n        else {\n            c += this.s;\n            while (i < a.t) {\n                c += a[i];\n                r[i++] = c & this.DM;\n                c >>= this.DB;\n            }\n            c += a.s;\n        }\n        r.s = (c < 0) ? -1 : 0;\n        if (c > 0) {\n            r[i++] = c;\n        }\n        else if (c < -1) {\n            r[i++] = this.DV + c;\n        }\n        r.t = i;\n        r.clamp();\n    };\n    // BigInteger.prototype.dMultiply = bnpDMultiply;\n    // (protected) this *= n, this >= 0, 1 < n < DV\n    BigInteger.prototype.dMultiply = function (n) {\n        this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);\n        ++this.t;\n        this.clamp();\n    };\n    // BigInteger.prototype.dAddOffset = bnpDAddOffset;\n    // (protected) this += n << w words, this >= 0\n    BigInteger.prototype.dAddOffset = function (n, w) {\n        if (n == 0) {\n            return;\n        }\n        while (this.t <= w) {\n            this[this.t++] = 0;\n        }\n        this[w] += n;\n        while (this[w] >= this.DV) {\n            this[w] -= this.DV;\n            if (++w >= this.t) {\n                this[this.t++] = 0;\n            }\n            ++this[w];\n        }\n    };\n    // BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n    // (protected) r = lower n words of \"this * a\", a.t <= n\n    // \"this\" should be the larger one if appropriate.\n    BigInteger.prototype.multiplyLowerTo = function (a, n, r) {\n        var i = Math.min(this.t + a.t, n);\n        r.s = 0; // assumes a,this >= 0\n        r.t = i;\n        while (i > 0) {\n            r[--i] = 0;\n        }\n        for (var j = r.t - this.t; i < j; ++i) {\n            r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);\n        }\n        for (var j = Math.min(a.t, n); i < j; ++i) {\n            this.am(0, a[i], r, i, 0, n - i);\n        }\n        r.clamp();\n    };\n    // BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n    // (protected) r = \"this * a\" without lower n words, n > 0\n    // \"this\" should be the larger one if appropriate.\n    BigInteger.prototype.multiplyUpperTo = function (a, n, r) {\n        --n;\n        var i = r.t = this.t + a.t - n;\n        r.s = 0; // assumes a,this >= 0\n        while (--i >= 0) {\n            r[i] = 0;\n        }\n        for (i = Math.max(n - this.t, 0); i < a.t; ++i) {\n            r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);\n        }\n        r.clamp();\n        r.drShiftTo(1, r);\n    };\n    // BigInteger.prototype.modInt = bnpModInt;\n    // (protected) this % n, n < 2^26\n    BigInteger.prototype.modInt = function (n) {\n        if (n <= 0) {\n            return 0;\n        }\n        var d = this.DV % n;\n        var r = (this.s < 0) ? n - 1 : 0;\n        if (this.t > 0) {\n            if (d == 0) {\n                r = this[0] % n;\n            }\n            else {\n                for (var i = this.t - 1; i >= 0; --i) {\n                    r = (d * r + this[i]) % n;\n                }\n            }\n        }\n        return r;\n    };\n    // BigInteger.prototype.millerRabin = bnpMillerRabin;\n    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n    BigInteger.prototype.millerRabin = function (t) {\n        var n1 = this.subtract(BigInteger.ONE);\n        var k = n1.getLowestSetBit();\n        if (k <= 0) {\n            return false;\n        }\n        var r = n1.shiftRight(k);\n        t = (t + 1) >> 1;\n        if (t > lowprimes.length) {\n            t = lowprimes.length;\n        }\n        var a = nbi();\n        for (var i = 0; i < t; ++i) {\n            // Pick bases at random, instead of starting at 2\n            a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);\n            var y = a.modPow(r, this);\n            if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n                var j = 1;\n                while (j++ < k && y.compareTo(n1) != 0) {\n                    y = y.modPowInt(2, this);\n                    if (y.compareTo(BigInteger.ONE) == 0) {\n                        return false;\n                    }\n                }\n                if (y.compareTo(n1) != 0) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    };\n    // BigInteger.prototype.square = bnSquare;\n    // (public) this^2\n    BigInteger.prototype.square = function () {\n        var r = nbi();\n        this.squareTo(r);\n        return r;\n    };\n    //#region ASYNC\n    // Public API method\n    BigInteger.prototype.gcda = function (a, callback) {\n        var x = (this.s < 0) ? this.negate() : this.clone();\n        var y = (a.s < 0) ? a.negate() : a.clone();\n        if (x.compareTo(y) < 0) {\n            var t = x;\n            x = y;\n            y = t;\n        }\n        var i = x.getLowestSetBit();\n        var g = y.getLowestSetBit();\n        if (g < 0) {\n            callback(x);\n            return;\n        }\n        if (i < g) {\n            g = i;\n        }\n        if (g > 0) {\n            x.rShiftTo(g, x);\n            y.rShiftTo(g, y);\n        }\n        // Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen.\n        var gcda1 = function () {\n            if ((i = x.getLowestSetBit()) > 0) {\n                x.rShiftTo(i, x);\n            }\n            if ((i = y.getLowestSetBit()) > 0) {\n                y.rShiftTo(i, y);\n            }\n            if (x.compareTo(y) >= 0) {\n                x.subTo(y, x);\n                x.rShiftTo(1, x);\n            }\n            else {\n                y.subTo(x, y);\n                y.rShiftTo(1, y);\n            }\n            if (!(x.signum() > 0)) {\n                if (g > 0) {\n                    y.lShiftTo(g, y);\n                }\n                setTimeout(function () { callback(y); }, 0); // escape\n            }\n            else {\n                setTimeout(gcda1, 0);\n            }\n        };\n        setTimeout(gcda1, 10);\n    };\n    // (protected) alternate constructor\n    BigInteger.prototype.fromNumberAsync = function (a, b, c, callback) {\n        if (\"number\" == typeof b) {\n            if (a < 2) {\n                this.fromInt(1);\n            }\n            else {\n                this.fromNumber(a, c);\n                if (!this.testBit(a - 1)) {\n                    this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\n                }\n                if (this.isEven()) {\n                    this.dAddOffset(1, 0);\n                }\n                var bnp_1 = this;\n                var bnpfn1_1 = function () {\n                    bnp_1.dAddOffset(2, 0);\n                    if (bnp_1.bitLength() > a) {\n                        bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1);\n                    }\n                    if (bnp_1.isProbablePrime(b)) {\n                        setTimeout(function () { callback(); }, 0); // escape\n                    }\n                    else {\n                        setTimeout(bnpfn1_1, 0);\n                    }\n                };\n                setTimeout(bnpfn1_1, 0);\n            }\n        }\n        else {\n            var x = [];\n            var t = a & 7;\n            x.length = (a >> 3) + 1;\n            b.nextBytes(x);\n            if (t > 0) {\n                x[0] &= ((1 << t) - 1);\n            }\n            else {\n                x[0] = 0;\n            }\n            this.fromString(x, 256);\n        }\n    };\n    return BigInteger;\n}());\nexport { BigInteger };\n//#region REDUCERS\n//#region NullExp\nvar NullExp = /** @class */ (function () {\n    function NullExp() {\n    }\n    // NullExp.prototype.convert = nNop;\n    NullExp.prototype.convert = function (x) {\n        return x;\n    };\n    // NullExp.prototype.revert = nNop;\n    NullExp.prototype.revert = function (x) {\n        return x;\n    };\n    // NullExp.prototype.mulTo = nMulTo;\n    NullExp.prototype.mulTo = function (x, y, r) {\n        x.multiplyTo(y, r);\n    };\n    // NullExp.prototype.sqrTo = nSqrTo;\n    NullExp.prototype.sqrTo = function (x, r) {\n        x.squareTo(r);\n    };\n    return NullExp;\n}());\n// Modular reduction using \"classic\" algorithm\nvar Classic = /** @class */ (function () {\n    function Classic(m) {\n        this.m = m;\n    }\n    // Classic.prototype.convert = cConvert;\n    Classic.prototype.convert = function (x) {\n        if (x.s < 0 || x.compareTo(this.m) >= 0) {\n            return x.mod(this.m);\n        }\n        else {\n            return x;\n        }\n    };\n    // Classic.prototype.revert = cRevert;\n    Classic.prototype.revert = function (x) {\n        return x;\n    };\n    // Classic.prototype.reduce = cReduce;\n    Classic.prototype.reduce = function (x) {\n        x.divRemTo(this.m, null, x);\n    };\n    // Classic.prototype.mulTo = cMulTo;\n    Classic.prototype.mulTo = function (x, y, r) {\n        x.multiplyTo(y, r);\n        this.reduce(r);\n    };\n    // Classic.prototype.sqrTo = cSqrTo;\n    Classic.prototype.sqrTo = function (x, r) {\n        x.squareTo(r);\n        this.reduce(r);\n    };\n    return Classic;\n}());\n//#endregion\n//#region Montgomery\n// Montgomery reduction\nvar Montgomery = /** @class */ (function () {\n    function Montgomery(m) {\n        this.m = m;\n        this.mp = m.invDigit();\n        this.mpl = this.mp & 0x7fff;\n        this.mph = this.mp >> 15;\n        this.um = (1 << (m.DB - 15)) - 1;\n        this.mt2 = 2 * m.t;\n    }\n    // Montgomery.prototype.convert = montConvert;\n    // xR mod m\n    Montgomery.prototype.convert = function (x) {\n        var r = nbi();\n        x.abs().dlShiftTo(this.m.t, r);\n        r.divRemTo(this.m, null, r);\n        if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {\n            this.m.subTo(r, r);\n        }\n        return r;\n    };\n    // Montgomery.prototype.revert = montRevert;\n    // x/R mod m\n    Montgomery.prototype.revert = function (x) {\n        var r = nbi();\n        x.copyTo(r);\n        this.reduce(r);\n        return r;\n    };\n    // Montgomery.prototype.reduce = montReduce;\n    // x = x/R mod m (HAC 14.32)\n    Montgomery.prototype.reduce = function (x) {\n        while (x.t <= this.mt2) {\n            // pad x so am has enough room later\n            x[x.t++] = 0;\n        }\n        for (var i = 0; i < this.m.t; ++i) {\n            // faster way of calculating u0 = x[i]*mp mod DV\n            var j = x[i] & 0x7fff;\n            var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;\n            // use am to combine the multiply-shift-add into one call\n            j = i + this.m.t;\n            x[j] += this.m.am(0, u0, x, i, 0, this.m.t);\n            // propagate carry\n            while (x[j] >= x.DV) {\n                x[j] -= x.DV;\n                x[++j]++;\n            }\n        }\n        x.clamp();\n        x.drShiftTo(this.m.t, x);\n        if (x.compareTo(this.m) >= 0) {\n            x.subTo(this.m, x);\n        }\n    };\n    // Montgomery.prototype.mulTo = montMulTo;\n    // r = \"xy/R mod m\"; x,y != r\n    Montgomery.prototype.mulTo = function (x, y, r) {\n        x.multiplyTo(y, r);\n        this.reduce(r);\n    };\n    // Montgomery.prototype.sqrTo = montSqrTo;\n    // r = \"x^2/R mod m\"; x != r\n    Montgomery.prototype.sqrTo = function (x, r) {\n        x.squareTo(r);\n        this.reduce(r);\n    };\n    return Montgomery;\n}());\n//#endregion Montgomery\n//#region Barrett\n// Barrett modular reduction\nvar Barrett = /** @class */ (function () {\n    function Barrett(m) {\n        this.m = m;\n        // setup Barrett\n        this.r2 = nbi();\n        this.q3 = nbi();\n        BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);\n        this.mu = this.r2.divide(m);\n    }\n    // Barrett.prototype.convert = barrettConvert;\n    Barrett.prototype.convert = function (x) {\n        if (x.s < 0 || x.t > 2 * this.m.t) {\n            return x.mod(this.m);\n        }\n        else if (x.compareTo(this.m) < 0) {\n            return x;\n        }\n        else {\n            var r = nbi();\n            x.copyTo(r);\n            this.reduce(r);\n            return r;\n        }\n    };\n    // Barrett.prototype.revert = barrettRevert;\n    Barrett.prototype.revert = function (x) {\n        return x;\n    };\n    // Barrett.prototype.reduce = barrettReduce;\n    // x = x mod m (HAC 14.42)\n    Barrett.prototype.reduce = function (x) {\n        x.drShiftTo(this.m.t - 1, this.r2);\n        if (x.t > this.m.t + 1) {\n            x.t = this.m.t + 1;\n            x.clamp();\n        }\n        this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);\n        this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);\n        while (x.compareTo(this.r2) < 0) {\n            x.dAddOffset(1, this.m.t + 1);\n        }\n        x.subTo(this.r2, x);\n        while (x.compareTo(this.m) >= 0) {\n            x.subTo(this.m, x);\n        }\n    };\n    // Barrett.prototype.mulTo = barrettMulTo;\n    // r = x*y mod m; x,y != r\n    Barrett.prototype.mulTo = function (x, y, r) {\n        x.multiplyTo(y, r);\n        this.reduce(r);\n    };\n    // Barrett.prototype.sqrTo = barrettSqrTo;\n    // r = x^2 mod m; x != r\n    Barrett.prototype.sqrTo = function (x, r) {\n        x.squareTo(r);\n        this.reduce(r);\n    };\n    return Barrett;\n}());\n//#endregion\n//#endregion REDUCERS\n// return new, unset BigInteger\nexport function nbi() { return new BigInteger(null); }\nexport function parseBigInt(str, r) {\n    return new BigInteger(str, r);\n}\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\nvar inBrowser = typeof navigator !== \"undefined\";\nif (inBrowser && j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n    // am2 avoids a big mult-and-extract completely.\n    // Max digit bits should be <= 30 because we do bitwise ops\n    // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n    BigInteger.prototype.am = function am2(i, x, w, j, c, n) {\n        var xl = x & 0x7fff;\n        var xh = x >> 15;\n        while (--n >= 0) {\n            var l = this[i] & 0x7fff;\n            var h = this[i++] >> 15;\n            var m = xh * l + h * xl;\n            l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);\n            c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);\n            w[j++] = l & 0x3fffffff;\n        }\n        return c;\n    };\n    dbits = 30;\n}\nelse if (inBrowser && j_lm && (navigator.appName != \"Netscape\")) {\n    // am1: use a single mult and divide to get the high bits,\n    // max digit bits should be 26 because\n    // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n    BigInteger.prototype.am = function am1(i, x, w, j, c, n) {\n        while (--n >= 0) {\n            var v = x * this[i++] + w[j] + c;\n            c = Math.floor(v / 0x4000000);\n            w[j++] = v & 0x3ffffff;\n        }\n        return c;\n    };\n    dbits = 26;\n}\nelse { // Mozilla/Netscape seems to prefer am3\n    // Alternately, set max digit bits to 28 since some\n    // browsers slow down when dealing with 32-bit numbers.\n    BigInteger.prototype.am = function am3(i, x, w, j, c, n) {\n        var xl = x & 0x3fff;\n        var xh = x >> 14;\n        while (--n >= 0) {\n            var l = this[i] & 0x3fff;\n            var h = this[i++] >> 14;\n            var m = xh * l + h * xl;\n            l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;\n            c = (l >> 28) + (m >> 14) + xh * h;\n            w[j++] = l & 0xfffffff;\n        }\n        return c;\n    };\n    dbits = 28;\n}\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = ((1 << dbits) - 1);\nBigInteger.prototype.DV = (1 << dbits);\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2, BI_FP);\nBigInteger.prototype.F1 = BI_FP - dbits;\nBigInteger.prototype.F2 = 2 * dbits - BI_FP;\n// Digit conversions\nvar BI_RC = [];\nvar rr;\nvar vv;\nrr = \"0\".charCodeAt(0);\nfor (vv = 0; vv <= 9; ++vv) {\n    BI_RC[rr++] = vv;\n}\nrr = \"a\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) {\n    BI_RC[rr++] = vv;\n}\nrr = \"A\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) {\n    BI_RC[rr++] = vv;\n}\nexport function intAt(s, i) {\n    var c = BI_RC[s.charCodeAt(i)];\n    return (c == null) ? -1 : c;\n}\n// return bigint initialized to value\nexport function nbv(i) {\n    var r = nbi();\n    r.fromInt(i);\n    return r;\n}\n// returns bit length of the integer x\nexport function nbits(x) {\n    var r = 1;\n    var t;\n    if ((t = x >>> 16) != 0) {\n        x = t;\n        r += 16;\n    }\n    if ((t = x >> 8) != 0) {\n        x = t;\n        r += 8;\n    }\n    if ((t = x >> 4) != 0) {\n        x = t;\n        r += 4;\n    }\n    if ((t = x >> 2) != 0) {\n        x = t;\n        r += 2;\n    }\n    if ((t = x >> 1) != 0) {\n        x = t;\n        r += 1;\n    }\n    return r;\n}\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n","// prng4.js - uses Arcfour as a PRNG\nvar Arcfour = /** @class */ (function () {\n    function Arcfour() {\n        this.i = 0;\n        this.j = 0;\n        this.S = [];\n    }\n    // Arcfour.prototype.init = ARC4init;\n    // Initialize arcfour context from key, an array of ints, each from [0..255]\n    Arcfour.prototype.init = function (key) {\n        var i;\n        var j;\n        var t;\n        for (i = 0; i < 256; ++i) {\n            this.S[i] = i;\n        }\n        j = 0;\n        for (i = 0; i < 256; ++i) {\n            j = (j + this.S[i] + key[i % key.length]) & 255;\n            t = this.S[i];\n            this.S[i] = this.S[j];\n            this.S[j] = t;\n        }\n        this.i = 0;\n        this.j = 0;\n    };\n    // Arcfour.prototype.next = ARC4next;\n    Arcfour.prototype.next = function () {\n        var t;\n        this.i = (this.i + 1) & 255;\n        this.j = (this.j + this.S[this.i]) & 255;\n        t = this.S[this.i];\n        this.S[this.i] = this.S[this.j];\n        this.S[this.j] = t;\n        return this.S[(t + this.S[this.i]) & 255];\n    };\n    return Arcfour;\n}());\nexport { Arcfour };\n// Plug in your RNG constructor here\nexport function prng_newstate() {\n    return new Arcfour();\n}\n// Pool size must be a multiple of 4 and greater than 32.\n// An array of bytes the size of the pool will be passed to init()\nexport var rng_psize = 256;\n","// Random number generator - requires a PRNG backend, e.g. prng4.js\nimport { prng_newstate, rng_psize } from \"./prng4\";\nvar rng_state;\nvar rng_pool = null;\nvar rng_pptr;\n// Initialize the pool with junk if needed.\nif (rng_pool == null) {\n    rng_pool = [];\n    rng_pptr = 0;\n    var t = void 0;\n    if (typeof window !== 'undefined' && self.crypto && self.crypto.getRandomValues) {\n        // Extract entropy (2048 bits) from RNG if available\n        var z = new Uint32Array(256);\n        self.crypto.getRandomValues(z);\n        for (t = 0; t < z.length; ++t) {\n            rng_pool[rng_pptr++] = z[t] & 255;\n        }\n    }\n    // Use mouse events for entropy, if we do not have enough entropy by the time\n    // we need it, entropy will be generated by Math.random.\n    var count = 0;\n    var onMouseMoveListener_1 = function (ev) {\n        count = count || 0;\n        if (count >= 256 || rng_pptr >= rng_psize) {\n            if (self.removeEventListener) {\n                self.removeEventListener(\"mousemove\", onMouseMoveListener_1, false);\n            }\n            else if (self.detachEvent) {\n                self.detachEvent(\"onmousemove\", onMouseMoveListener_1);\n            }\n            return;\n        }\n        try {\n            var mouseCoordinates = ev.x + ev.y;\n            rng_pool[rng_pptr++] = mouseCoordinates & 255;\n            count += 1;\n        }\n        catch (e) {\n            // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.\n        }\n    };\n    if (typeof window !== 'undefined') {\n        if (self.addEventListener) {\n            self.addEventListener(\"mousemove\", onMouseMoveListener_1, false);\n        }\n        else if (self.attachEvent) {\n            self.attachEvent(\"onmousemove\", onMouseMoveListener_1);\n        }\n    }\n}\nfunction rng_get_byte() {\n    if (rng_state == null) {\n        rng_state = prng_newstate();\n        // At this point, we may not have collected enough entropy.  If not, fall back to Math.random\n        while (rng_pptr < rng_psize) {\n            var random = Math.floor(65536 * Math.random());\n            rng_pool[rng_pptr++] = random & 255;\n        }\n        rng_state.init(rng_pool);\n        for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {\n            rng_pool[rng_pptr] = 0;\n        }\n        rng_pptr = 0;\n    }\n    // TODO: allow reseeding after first request\n    return rng_state.next();\n}\nvar SecureRandom = /** @class */ (function () {\n    function SecureRandom() {\n    }\n    SecureRandom.prototype.nextBytes = function (ba) {\n        for (var i = 0; i < ba.length; ++i) {\n            ba[i] = rng_get_byte();\n        }\n    };\n    return SecureRandom;\n}());\nexport { SecureRandom };\n","/*\n * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined\n * in FIPS 180-2\n * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for details.\n * Also http://anmar.eu.org/projects/jssha2/\n */\n// /*\n//  * Configurable variables. You may need to tweak these to be compatible with\n//  * the server-side, but the defaults work in most cases.\n//  */\n// var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase        */\n// var b64pad = \"\"; /* base-64 pad character. \"=\" for strict RFC compliance   */\n// /*\n//  * These are the functions you'll usually want to call\n//  * They take string arguments and return either hex or base-64 encoded strings\n//  */\n// function hex_sha256(s: string) {\n//     return rstr2hex(rstr_sha256(str2rstr_utf8(s)));\n// }\n// function b64_sha256(s: string) {\n//     return rstr2b64(rstr_sha256(str2rstr_utf8(s)));\n// }\n// function any_sha256(s: string, e: any) {\n//     return rstr2any(rstr_sha256(str2rstr_utf8(s)), e);\n// }\n// function hex_hmac_sha256(k: string, d: any) {\n//     return rstr2hex(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)));\n// }\n// function b64_hmac_sha256(k: string, d: any) {\n//     return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)));\n// }\n// function any_hmac_sha256(k: string, d: string, e: any) {\n//     return rstr2any(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)), e);\n// }\n// /*\n//  * Perform a simple self-test to see if the VM is working\n//  */\n// function sha256_vm_test() {\n//     return (\n//         hex_sha256(\"abc\").toLowerCase() ==\n//         \"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\"\n//     );\n// }\n/*\n * Calculate the sha256 of a raw string\n */\nexport function rstr_sha256(s) {\n    return binb2rstr(binb_sha256(rstr2binb(s), s.length * 8));\n}\n// /*\n//  * Calculate the HMAC-sha256 of a key and some data (raw strings)\n//  */\n// function rstr_hmac_sha256(key: string, data: any) {\n//     var bkey = rstr2binb(key);\n//     if (bkey.length > 16) bkey = binb_sha256(bkey, key.length * 8);\n//     var ipad = Array(16),\n//         opad = Array(16);\n//     for (var i = 0; i < 16; i++) {\n//         ipad[i] = bkey[i] ^ 0x36363636;\n//         opad[i] = bkey[i] ^ 0x5c5c5c5c;\n//     }\n//     var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8);\n//     return binb2rstr(binb_sha256(opad.concat(hash), 512 + 256));\n// }\n// /*\n//  * Convert a raw string to a hex string\n//  */\nexport function rstr2hex(input) {\n    var hex_tab = \"0123456789abcdef\";\n    var output = \"\";\n    for (var i = 0; i < input.length; i++) {\n        var x = input.charCodeAt(i);\n        output += hex_tab.charAt((x >>> 4) & 0x0f) + hex_tab.charAt(x & 0x0f);\n    }\n    return output;\n}\n// /*\n//  * Convert a raw string to a base-64 string\n//  */\n// function rstr2b64(input: string) {\n//     try {\n//         b64pad;\n//     } catch (e) {\n//         b64pad = \"\";\n//     }\n//     var tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n//     var output = \"\";\n//     var len = input.length;\n//     for (var i = 0; i < len; i += 3) {\n//         var triplet =\n//             (input.charCodeAt(i) << 16) |\n//             (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) |\n//             (i + 2 < len ? input.charCodeAt(i + 2) : 0);\n//         for (var j = 0; j < 4; j++) {\n//             if (i * 8 + j * 6 > input.length * 8) output += b64pad;\n//             else output += tab.charAt((triplet >>> (6 * (3 - j))) & 0x3f);\n//         }\n//     }\n//     return output;\n// }\n// /*\n//  * Convert a raw string to an arbitrary string encoding\n//  */\n// function rstr2any(input: string, encoding: string) {\n//     var divisor = encoding.length;\n//     var remainders = Array();\n//     var i, q, x, quotient;\n//     /* Convert to an array of 16-bit big-endian values, forming the dividend */\n//     var dividend = Array(Math.ceil(input.length / 2));\n//     for (i = 0; i < dividend.length; i++) {\n//         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);\n//     }\n//     /*\n//      * Repeatedly perform a long division. The binary array forms the dividend,\n//      * the length of the encoding is the divisor. Once computed, the quotient\n//      * forms the dividend for the next step. We stop when the dividend is zero.\n//      * All remainders are stored for later use.\n//      */\n//     while (dividend.length > 0) {\n//         quotient = Array();\n//         x = 0;\n//         for (i = 0; i < dividend.length; i++) {\n//             x = (x << 16) + dividend[i];\n//             q = Math.floor(x / divisor);\n//             x -= q * divisor;\n//             if (quotient.length > 0 || q > 0) quotient[quotient.length] = q;\n//         }\n//         remainders[remainders.length] = x;\n//         dividend = quotient;\n//     }\n//     /* Convert the remainders to the output string */\n//     var output = \"\";\n//     for (i = remainders.length - 1; i >= 0; i--) output += encoding.charAt(remainders[i]);\n//     /* Append leading zero equivalents */\n//     var full_length = Math.ceil(\n//         (input.length * 8) / (Math.log(encoding.length) / Math.log(2)),\n//     );\n//     for (i = output.length; i < full_length; i++) output = encoding[0] + output;\n//     return output;\n// }\n// /*\n//  * Encode a string as utf-8.\n//  * For efficiency, this assumes the input is valid utf-16.\n//  */\n// function str2rstr_utf8(input: string) {\n//     var output = \"\";\n//     var i = -1;\n//     var x, y;\n//     while (++i < input.length) {\n//         /* Decode utf-16 surrogate pairs */\n//         x = input.charCodeAt(i);\n//         y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;\n//         if (0xd800 <= x && x <= 0xdbff && 0xdc00 <= y && y <= 0xdfff) {\n//             x = 0x10000 + ((x & 0x03ff) << 10) + (y & 0x03ff);\n//             i++;\n//         }\n//         /* Encode output as utf-8 */\n//         if (x <= 0x7f) output += String.fromCharCode(x);\n//         else if (x <= 0x7ff)\n//             output += String.fromCharCode(0xc0 | ((x >>> 6) & 0x1f), 0x80 | (x & 0x3f));\n//         else if (x <= 0xffff)\n//             output += String.fromCharCode(\n//                 0xe0 | ((x >>> 12) & 0x0f),\n//                 0x80 | ((x >>> 6) & 0x3f),\n//                 0x80 | (x & 0x3f),\n//             );\n//         else if (x <= 0x1fffff)\n//             output += String.fromCharCode(\n//                 0xf0 | ((x >>> 18) & 0x07),\n//                 0x80 | ((x >>> 12) & 0x3f),\n//                 0x80 | ((x >>> 6) & 0x3f),\n//                 0x80 | (x & 0x3f),\n//             );\n//     }\n//     return output;\n// }\n// /*\n//  * Encode a string as utf-16\n//  */\n// function str2rstr_utf16le(input: string) {\n//     var output = \"\";\n//     for (var i = 0; i < input.length; i++)\n//         output += String.fromCharCode(\n//             input.charCodeAt(i) & 0xff,\n//             (input.charCodeAt(i) >>> 8) & 0xff,\n//         );\n//     return output;\n// }\n// function str2rstr_utf16be(input: string) {\n//     var output = \"\";\n//     for (var i = 0; i < input.length; i++)\n//         output += String.fromCharCode(\n//             (input.charCodeAt(i) >>> 8) & 0xff,\n//             input.charCodeAt(i) & 0xff,\n//         );\n//     return output;\n// }\n/*\n * Convert a raw string to an array of big-endian words\n * Characters >255 have their high-byte silently ignored.\n */\nfunction rstr2binb(input) {\n    var output = Array(input.length >> 2);\n    for (var i = 0; i < output.length; i++)\n        output[i] = 0;\n    for (var i = 0; i < input.length * 8; i += 8)\n        output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (24 - (i % 32));\n    return output;\n}\n/*\n * Convert an array of big-endian words to a string\n */\nfunction binb2rstr(input) {\n    var output = \"\";\n    for (var i = 0; i < input.length * 32; i += 8)\n        output += String.fromCharCode((input[i >> 5] >>> (24 - (i % 32))) & 0xff);\n    return output;\n}\n/*\n * Main sha256 function, with its support functions\n */\nfunction sha256_S(X, n) {\n    return (X >>> n) | (X << (32 - n));\n}\nfunction sha256_R(X, n) {\n    return X >>> n;\n}\nfunction sha256_Ch(x, y, z) {\n    return (x & y) ^ (~x & z);\n}\nfunction sha256_Maj(x, y, z) {\n    return (x & y) ^ (x & z) ^ (y & z);\n}\nfunction sha256_Sigma0256(x) {\n    return sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22);\n}\nfunction sha256_Sigma1256(x) {\n    return sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25);\n}\nfunction sha256_Gamma0256(x) {\n    return sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3);\n}\nfunction sha256_Gamma1256(x) {\n    return sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10);\n}\n// function sha256_Sigma0512(x: number) {\n//     return sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39);\n// }\n// function sha256_Sigma1512(x: number) {\n//     return sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41);\n// }\n// function sha256_Gamma0512(x: number) {\n//     return sha256_S(x, 1) ^ sha256_S(x, 8) ^ sha256_R(x, 7);\n// }\n// function sha256_Gamma1512(x: number) {\n//     return sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6);\n// }\nvar sha256_K = new Array(1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998);\nfunction binb_sha256(m, l) {\n    var HASH = new Array(1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225);\n    var W = new Array(64);\n    var a, b, c, d, e, f, g, h;\n    var i, j, T1, T2;\n    /* append padding */\n    m[l >> 5] |= 0x80 << (24 - (l % 32));\n    m[(((l + 64) >> 9) << 4) + 15] = l;\n    for (i = 0; i < m.length; i += 16) {\n        a = HASH[0];\n        b = HASH[1];\n        c = HASH[2];\n        d = HASH[3];\n        e = HASH[4];\n        f = HASH[5];\n        g = HASH[6];\n        h = HASH[7];\n        for (j = 0; j < 64; j++) {\n            if (j < 16)\n                W[j] = m[j + i];\n            else\n                W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]), sha256_Gamma0256(W[j - 15])), W[j - 16]);\n            T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)), sha256_K[j]), W[j]);\n            T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));\n            h = g;\n            g = f;\n            f = e;\n            e = safe_add(d, T1);\n            d = c;\n            c = b;\n            b = a;\n            a = safe_add(T1, T2);\n        }\n        HASH[0] = safe_add(a, HASH[0]);\n        HASH[1] = safe_add(b, HASH[1]);\n        HASH[2] = safe_add(c, HASH[2]);\n        HASH[3] = safe_add(d, HASH[3]);\n        HASH[4] = safe_add(e, HASH[4]);\n        HASH[5] = safe_add(f, HASH[5]);\n        HASH[6] = safe_add(g, HASH[6]);\n        HASH[7] = safe_add(h, HASH[7]);\n    }\n    return HASH;\n}\nfunction safe_add(x, y) {\n    var lsw = (x & 0xffff) + (y & 0xffff);\n    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n    return (msw << 16) | (lsw & 0xffff);\n}\n","// Depends on jsbn.js and rng.js\n// Version 1.1: support utf-8 encoding in pkcs1pad2\n// convert a (hex) string to a bignum object\nimport { BigInteger, nbi, parseBigInt } from \"./jsbn\";\nimport { SecureRandom } from \"./rng\";\nimport { rstr_sha256 } from './sha256';\n// function linebrk(s,n) {\n//   var ret = \"\";\n//   var i = 0;\n//   while(i + n < s.length) {\n//     ret += s.substring(i,i+n) + \"\\n\";\n//     i += n;\n//   }\n//   return ret + s.substring(i,s.length);\n// }\n// function byte2Hex(b) {\n//   if(b < 0x10)\n//     return \"0\" + b.toString(16);\n//   else\n//     return b.toString(16);\n// }\nfunction pkcs1pad1(s, n) {\n    if (n < s.length + 22) {\n        console.error(\"Message too long for RSA\");\n        return null;\n    }\n    var len = n - s.length - 6;\n    var filler = \"\";\n    for (var f = 0; f < len; f += 2) {\n        filler += \"ff\";\n    }\n    var m = \"0001\" + filler + \"00\" + s;\n    return parseBigInt(m, 16);\n}\n// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint\nfunction pkcs1pad2(s, n) {\n    if (n < s.length + 11) { // TODO: fix for utf-8\n        console.error(\"Message too long for RSA\");\n        return null;\n    }\n    var ba = [];\n    var i = s.length - 1;\n    while (i >= 0 && n > 0) {\n        var c = s.charCodeAt(i--);\n        if (c < 128) { // encode using utf-8\n            ba[--n] = c;\n        }\n        else if ((c > 127) && (c < 2048)) {\n            ba[--n] = (c & 63) | 128;\n            ba[--n] = (c >> 6) | 192;\n        }\n        else {\n            ba[--n] = (c & 63) | 128;\n            ba[--n] = ((c >> 6) & 63) | 128;\n            ba[--n] = (c >> 12) | 224;\n        }\n    }\n    ba[--n] = 0;\n    var rng = new SecureRandom();\n    var x = [];\n    while (n > 2) { // random non-zero pad\n        x[0] = 0;\n        while (x[0] == 0) {\n            rng.nextBytes(x);\n        }\n        ba[--n] = x[0];\n    }\n    ba[--n] = 2;\n    ba[--n] = 0;\n    return new BigInteger(ba);\n}\n// PKCS#1 (OAEP) mask generation function, using SHA-256\nfunction oaep_mgf1_arr(seed, len, hashFunc) {\n    var mask = \"\", i = 0;\n    while (mask.length < len) {\n        mask += hashFunc(String.fromCharCode.apply(String, seed.concat([\n            (i & 0xff000000) >> 24,\n            (i & 0x00ff0000) >> 16,\n            (i & 0x0000ff00) >> 8,\n            i & 0x000000ff,\n        ])));\n        i += 1;\n    }\n    return mask;\n}\nvar SHA256_SIZE = 32;\n// PKCS#1 (OAEP) pad input string s to n bytes, and return a BigInteger\nexport function oaep_pad(s, n) {\n    var hashLen = SHA256_SIZE;\n    var hashFunc = rstr_sha256;\n    if (s.length + 2 * hashLen + 2 > n) {\n        throw \"Message too long for RSA\";\n    }\n    var PS = \"\", i;\n    for (i = 0; i < n - s.length - 2 * hashLen - 2; i += 1) {\n        PS += \"\\x00\";\n    }\n    var DB = hashFunc(\"\") + PS + \"\\x01\" + s, seed = new Array(hashLen);\n    new SecureRandom().nextBytes(seed);\n    var dbMask = oaep_mgf1_arr(seed, DB.length, hashFunc), maskedDB = [];\n    for (i = 0; i < DB.length; i += 1) {\n        maskedDB[i] = DB.charCodeAt(i) ^ dbMask.charCodeAt(i);\n    }\n    var seedMask = oaep_mgf1_arr(maskedDB, seed.length, hashFunc), maskedSeed = [0];\n    for (i = 0; i < seed.length; i += 1) {\n        maskedSeed[i + 1] = seed[i] ^ seedMask.charCodeAt(i);\n    }\n    return new BigInteger(maskedSeed.concat(maskedDB));\n}\n// \"empty\" RSA key constructor\nvar RSAKey = /** @class */ (function () {\n    function RSAKey() {\n        this.n = null;\n        this.e = 0;\n        this.d = null;\n        this.p = null;\n        this.q = null;\n        this.dmp1 = null;\n        this.dmq1 = null;\n        this.coeff = null;\n    }\n    //#region PROTECTED\n    // protected\n    // RSAKey.prototype.doPublic = RSADoPublic;\n    // Perform raw public operation on \"x\": return x^e (mod n)\n    RSAKey.prototype.doPublic = function (x) {\n        return x.modPowInt(this.e, this.n);\n    };\n    // RSAKey.prototype.doPrivate = RSADoPrivate;\n    // Perform raw private operation on \"x\": return x^d (mod n)\n    RSAKey.prototype.doPrivate = function (x) {\n        if (this.p == null || this.q == null) {\n            return x.modPow(this.d, this.n);\n        }\n        // TODO: re-calculate any missing CRT params\n        var xp = x.mod(this.p).modPow(this.dmp1, this.p);\n        var xq = x.mod(this.q).modPow(this.dmq1, this.q);\n        while (xp.compareTo(xq) < 0) {\n            xp = xp.add(this.p);\n        }\n        return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);\n    };\n    //#endregion PROTECTED\n    //#region PUBLIC\n    // RSAKey.prototype.setPublic = RSASetPublic;\n    // Set the public key fields N and e from hex strings\n    RSAKey.prototype.setPublic = function (N, E) {\n        if (N != null && E != null && N.length > 0 && E.length > 0) {\n            this.n = parseBigInt(N, 16);\n            this.e = parseInt(E, 16);\n        }\n        else {\n            console.error(\"Invalid RSA public key\");\n        }\n    };\n    // RSAKey.prototype.encrypt = RSAEncrypt;\n    // Return the PKCS#1 RSA encryption of \"text\" as an even-length hex string\n    RSAKey.prototype.encrypt = function (text, paddingFunction) {\n        if (typeof paddingFunction === 'undefined') {\n            paddingFunction = pkcs1pad2;\n        }\n        var maxLength = (this.n.bitLength() + 7) >> 3;\n        var m = paddingFunction(text, maxLength);\n        if (m == null) {\n            return null;\n        }\n        var c = this.doPublic(m);\n        if (c == null) {\n            return null;\n        }\n        var h = c.toString(16);\n        var length = h.length;\n        // fix zero before result\n        for (var i = 0; i < maxLength * 2 - length; i++) {\n            h = \"0\" + h;\n        }\n        return h;\n    };\n    // RSAKey.prototype.setPrivate = RSASetPrivate;\n    // Set the private key fields N, e, and d from hex strings\n    RSAKey.prototype.setPrivate = function (N, E, D) {\n        if (N != null && E != null && N.length > 0 && E.length > 0) {\n            this.n = parseBigInt(N, 16);\n            this.e = parseInt(E, 16);\n            this.d = parseBigInt(D, 16);\n        }\n        else {\n            console.error(\"Invalid RSA private key\");\n        }\n    };\n    // RSAKey.prototype.setPrivateEx = RSASetPrivateEx;\n    // Set the private key fields N, e, d and CRT params from hex strings\n    RSAKey.prototype.setPrivateEx = function (N, E, D, P, Q, DP, DQ, C) {\n        if (N != null && E != null && N.length > 0 && E.length > 0) {\n            this.n = parseBigInt(N, 16);\n            this.e = parseInt(E, 16);\n            this.d = parseBigInt(D, 16);\n            this.p = parseBigInt(P, 16);\n            this.q = parseBigInt(Q, 16);\n            this.dmp1 = parseBigInt(DP, 16);\n            this.dmq1 = parseBigInt(DQ, 16);\n            this.coeff = parseBigInt(C, 16);\n        }\n        else {\n            console.error(\"Invalid RSA private key\");\n        }\n    };\n    // RSAKey.prototype.generate = RSAGenerate;\n    // Generate a new random private key B bits long, using public expt E\n    RSAKey.prototype.generate = function (B, E) {\n        var rng = new SecureRandom();\n        var qs = B >> 1;\n        this.e = parseInt(E, 16);\n        var ee = new BigInteger(E, 16);\n        for (;;) {\n            for (;;) {\n                this.p = new BigInteger(B - qs, 1, rng);\n                if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {\n                    break;\n                }\n            }\n            for (;;) {\n                this.q = new BigInteger(qs, 1, rng);\n                if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {\n                    break;\n                }\n            }\n            if (this.p.compareTo(this.q) <= 0) {\n                var t = this.p;\n                this.p = this.q;\n                this.q = t;\n            }\n            var p1 = this.p.subtract(BigInteger.ONE);\n            var q1 = this.q.subtract(BigInteger.ONE);\n            var phi = p1.multiply(q1);\n            if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {\n                this.n = this.p.multiply(this.q);\n                this.d = ee.modInverse(phi);\n                this.dmp1 = this.d.mod(p1);\n                this.dmq1 = this.d.mod(q1);\n                this.coeff = this.q.modInverse(this.p);\n                break;\n            }\n        }\n    };\n    // RSAKey.prototype.decrypt = RSADecrypt;\n    // Return the PKCS#1 RSA decryption of \"ctext\".\n    // \"ctext\" is an even-length hex string and the output is a plain string.\n    RSAKey.prototype.decrypt = function (ctext) {\n        var c = parseBigInt(ctext, 16);\n        var m = this.doPrivate(c);\n        if (m == null) {\n            return null;\n        }\n        return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);\n    };\n    // Generate a new random private key B bits long, using public expt E\n    RSAKey.prototype.generateAsync = function (B, E, callback) {\n        var rng = new SecureRandom();\n        var qs = B >> 1;\n        this.e = parseInt(E, 16);\n        var ee = new BigInteger(E, 16);\n        var rsa = this;\n        // These functions have non-descript names because they were originally for(;;) loops.\n        // I don't know about cryptography to give them better names than loop1-4.\n        var loop1 = function () {\n            var loop4 = function () {\n                if (rsa.p.compareTo(rsa.q) <= 0) {\n                    var t = rsa.p;\n                    rsa.p = rsa.q;\n                    rsa.q = t;\n                }\n                var p1 = rsa.p.subtract(BigInteger.ONE);\n                var q1 = rsa.q.subtract(BigInteger.ONE);\n                var phi = p1.multiply(q1);\n                if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {\n                    rsa.n = rsa.p.multiply(rsa.q);\n                    rsa.d = ee.modInverse(phi);\n                    rsa.dmp1 = rsa.d.mod(p1);\n                    rsa.dmq1 = rsa.d.mod(q1);\n                    rsa.coeff = rsa.q.modInverse(rsa.p);\n                    setTimeout(function () { callback(); }, 0); // escape\n                }\n                else {\n                    setTimeout(loop1, 0);\n                }\n            };\n            var loop3 = function () {\n                rsa.q = nbi();\n                rsa.q.fromNumberAsync(qs, 1, rng, function () {\n                    rsa.q.subtract(BigInteger.ONE).gcda(ee, function (r) {\n                        if (r.compareTo(BigInteger.ONE) == 0 && rsa.q.isProbablePrime(10)) {\n                            setTimeout(loop4, 0);\n                        }\n                        else {\n                            setTimeout(loop3, 0);\n                        }\n                    });\n                });\n            };\n            var loop2 = function () {\n                rsa.p = nbi();\n                rsa.p.fromNumberAsync(B - qs, 1, rng, function () {\n                    rsa.p.subtract(BigInteger.ONE).gcda(ee, function (r) {\n                        if (r.compareTo(BigInteger.ONE) == 0 && rsa.p.isProbablePrime(10)) {\n                            setTimeout(loop3, 0);\n                        }\n                        else {\n                            setTimeout(loop2, 0);\n                        }\n                    });\n                });\n            };\n            setTimeout(loop2, 0);\n        };\n        setTimeout(loop1, 0);\n    };\n    RSAKey.prototype.sign = function (text, digestMethod, digestName) {\n        var header = getDigestHeader(digestName);\n        var digest = header + digestMethod(text).toString();\n        var maxLength = this.n.bitLength() / 4;\n        var m = pkcs1pad1(digest, maxLength);\n        if (m == null) {\n            return null;\n        }\n        var c = this.doPrivate(m);\n        if (c == null) {\n            return null;\n        }\n        var h = c.toString(16);\n        var length = h.length;\n        // fix zero before result\n        for (var i = 0; i < maxLength - length; i++) {\n            h = \"0\" + h;\n        }\n        return h;\n    };\n    RSAKey.prototype.verify = function (text, signature, digestMethod) {\n        var c = parseBigInt(signature, 16);\n        var m = this.doPublic(c);\n        if (m == null) {\n            return null;\n        }\n        var unpadded = m.toString(16).replace(/^1f+00/, \"\");\n        var digest = removeDigestHeader(unpadded);\n        return digest == digestMethod(text).toString();\n    };\n    return RSAKey;\n}());\nexport { RSAKey };\n// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext\nfunction pkcs1unpad2(d, n) {\n    var b = d.toByteArray();\n    var i = 0;\n    while (i < b.length && b[i] == 0) {\n        ++i;\n    }\n    if (b.length - i != n - 1 || b[i] != 2) {\n        return null;\n    }\n    ++i;\n    while (b[i] != 0) {\n        if (++i >= b.length) {\n            return null;\n        }\n    }\n    var ret = \"\";\n    while (++i < b.length) {\n        var c = b[i] & 255;\n        if (c < 128) { // utf-8 decode\n            ret += String.fromCharCode(c);\n        }\n        else if ((c > 191) && (c < 224)) {\n            ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));\n            ++i;\n        }\n        else {\n            ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));\n            i += 2;\n        }\n    }\n    return ret;\n}\n// https://tools.ietf.org/html/rfc3447#page-43\nvar DIGEST_HEADERS = {\n    md2: \"3020300c06082a864886f70d020205000410\",\n    md5: \"3020300c06082a864886f70d020505000410\",\n    sha1: \"3021300906052b0e03021a05000414\",\n    sha224: \"302d300d06096086480165030402040500041c\",\n    sha256: \"3031300d060960864801650304020105000420\",\n    sha384: \"3041300d060960864801650304020205000430\",\n    sha512: \"3051300d060960864801650304020305000440\",\n    ripemd160: \"3021300906052b2403020105000414\"\n};\nfunction getDigestHeader(name) {\n    return DIGEST_HEADERS[name] || \"\";\n}\nfunction removeDigestHeader(str) {\n    for (var name_1 in DIGEST_HEADERS) {\n        if (DIGEST_HEADERS.hasOwnProperty(name_1)) {\n            var header = DIGEST_HEADERS[name_1];\n            var len = header.length;\n            if (str.substring(0, len) == header) {\n                return str.substring(len);\n            }\n        }\n    }\n    return str;\n}\n// Return the PKCS#1 RSA encryption of \"text\" as a Base64-encoded string\n// function RSAEncryptB64(text) {\n//  var h = this.encrypt(text);\n//  if(h) return hex2b64(h); else return null;\n// }\n// public\n// RSAKey.prototype.encrypt_b64 = RSAEncryptB64;\n","/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license\n */\n/*\n * asn1.js - ASN.1 DER encoder classes\n *\n * Copyright (c) 2013-2017 Kenji Urushima (kenji.urushima@gmail.com)\n *\n * This software is licensed under the terms of the MIT License.\n * https://kjur.github.io/jsrsasign/license\n *\n * The above copyright and license notice shall be\n * included in all copies or substantial portions of the Software.\n */\nimport { BigInteger } from \"../jsbn/jsbn\";\nexport function extendClass(subc, superc, overrides) {\n    if (!superc || !subc) {\n        throw new Error(\"extend failed, please check that \" +\n            \"all dependencies are included.\");\n    }\n    var F = function () { };\n    F.prototype = superc.prototype;\n    subc.prototype = new F();\n    subc.prototype.constructor = subc;\n    subc.superclass = superc.prototype;\n    if (superc.prototype.constructor == Object.prototype.constructor) {\n        superc.prototype.constructor = superc;\n    }\n    if (overrides) {\n        var i;\n        for (i in overrides) {\n            subc.prototype[i] = overrides[i];\n        }\n        /*\n         * IE will not enumerate native functions in a derived object even if the\n         * function was overridden.  This is a workaround for specific functions\n         * we care about on the Object prototype.\n         * @property _IEEnumFix\n         * @param {Function} r  the object to receive the augmentation\n         * @param {Function} s  the object that supplies the properties to augment\n         * @static\n         * @private\n         */\n        var _IEEnumFix = function () { }, ADD = [\"toString\", \"valueOf\"];\n        try {\n            if (/MSIE/.test(navigator.userAgent)) {\n                _IEEnumFix = function (r, s) {\n                    for (i = 0; i < ADD.length; i = i + 1) {\n                        var fname = ADD[i], f = s[fname];\n                        if (typeof f === 'function' && f != Object.prototype[fname]) {\n                            r[fname] = f;\n                        }\n                    }\n                };\n            }\n        }\n        catch (ex) { }\n        ;\n        _IEEnumFix(subc.prototype, overrides);\n    }\n}\n/**\n * @fileOverview\n * @name asn1-1.0.js\n * @author Kenji Urushima kenji.urushima@gmail.com\n * @version asn1 1.0.13 (2017-Jun-02)\n * @since jsrsasign 2.1\n * @license <a href=\"https://kjur.github.io/jsrsasign/license/\">MIT License</a>\n */\n/**\n * kjur's class library name space\n * <p>\n * This name space provides following name spaces:\n * <ul>\n * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>\n * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>\n * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature\n * class and utilities</li>\n * </ul>\n * </p>\n * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.\n * @name KJUR\n * @namespace kjur's class library name space\n */\nexport var KJUR = {};\n/**\n * kjur's ASN.1 class library name space\n * <p>\n * This is ITU-T X.690 ASN.1 DER encoder class library and\n * class structure and methods is very similar to\n * org.bouncycastle.asn1 package of\n * well known BouncyCaslte Cryptography Library.\n * <h4>PROVIDING ASN.1 PRIMITIVES</h4>\n * Here are ASN.1 DER primitive classes.\n * <ul>\n * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>\n * <li>0x02 {@link KJUR.asn1.DERInteger}</li>\n * <li>0x03 {@link KJUR.asn1.DERBitString}</li>\n * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>\n * <li>0x05 {@link KJUR.asn1.DERNull}</li>\n * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>\n * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>\n * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>\n * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>\n * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>\n * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>\n * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>\n * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>\n * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>\n * <li>0x30 {@link KJUR.asn1.DERSequence}</li>\n * <li>0x31 {@link KJUR.asn1.DERSet}</li>\n * </ul>\n * <h4>OTHER ASN.1 CLASSES</h4>\n * <ul>\n * <li>{@link KJUR.asn1.ASN1Object}</li>\n * <li>{@link KJUR.asn1.DERAbstractString}</li>\n * <li>{@link KJUR.asn1.DERAbstractTime}</li>\n * <li>{@link KJUR.asn1.DERAbstractStructured}</li>\n * <li>{@link KJUR.asn1.DERTaggedObject}</li>\n * </ul>\n * <h4>SUB NAME SPACES</h4>\n * <ul>\n * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>\n * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>\n * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>\n * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>\n * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>\n * </ul>\n * </p>\n * NOTE: Please ignore method summary and document of this namespace.\n * This caused by a bug of jsdoc2.\n * @name KJUR.asn1\n * @namespace\n */\nif (typeof KJUR.asn1 == \"undefined\" || !KJUR.asn1)\n    KJUR.asn1 = {};\n/**\n * ASN1 utilities class\n * @name KJUR.asn1.ASN1Util\n * @class ASN1 utilities class\n * @since asn1 1.0.2\n */\nKJUR.asn1.ASN1Util = new function () {\n    this.integerToByteHex = function (i) {\n        var h = i.toString(16);\n        if ((h.length % 2) == 1)\n            h = '0' + h;\n        return h;\n    };\n    this.bigIntToMinTwosComplementsHex = function (bigIntegerValue) {\n        var h = bigIntegerValue.toString(16);\n        if (h.substring(0, 1) != '-') {\n            if (h.length % 2 == 1) {\n                h = '0' + h;\n            }\n            else {\n                if (!h.match(/^[0-7]/)) {\n                    h = '00' + h;\n                }\n            }\n        }\n        else {\n            var hPos = h.substring(1);\n            var xorLen = hPos.length;\n            if (xorLen % 2 == 1) {\n                xorLen += 1;\n            }\n            else {\n                if (!h.match(/^[0-7]/)) {\n                    xorLen += 2;\n                }\n            }\n            var hMask = '';\n            for (var i = 0; i < xorLen; i++) {\n                hMask += 'f';\n            }\n            var biMask = new BigInteger(hMask, 16);\n            var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE);\n            h = biNeg.toString(16).replace(/^-/, '');\n        }\n        return h;\n    };\n    /**\n     * get PEM string from hexadecimal data and header string\n     * @name getPEMStringFromHex\n     * @memberOf KJUR.asn1.ASN1Util\n     * @function\n     * @param {String} dataHex hexadecimal string of PEM body\n     * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY')\n     * @return {String} PEM formatted string of input data\n     * @description\n     * This method converts a hexadecimal string to a PEM string with\n     * a specified header. Its line break will be CRLF(\"\\r\\n\").\n     * @example\n     * var pem  = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY');\n     * // value of pem will be:\n     * -----BEGIN PRIVATE KEY-----\n     * YWFh\n     * -----END PRIVATE KEY-----\n     */\n    this.getPEMStringFromHex = function (dataHex, pemHeader) {\n        return hextopem(dataHex, pemHeader);\n    };\n    /**\n     * generate ASN1Object specifed by JSON parameters\n     * @name newObject\n     * @memberOf KJUR.asn1.ASN1Util\n     * @function\n     * @param {Array} param JSON parameter to generate ASN1Object\n     * @return {KJUR.asn1.ASN1Object} generated object\n     * @since asn1 1.0.3\n     * @description\n     * generate any ASN1Object specified by JSON param\n     * including ASN.1 primitive or structured.\n     * Generally 'param' can be described as follows:\n     * <blockquote>\n     * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER}\n     * </blockquote>\n     * 'TYPE-OF-ASN1OBJ' can be one of following symbols:\n     * <ul>\n     * <li>'bool' - DERBoolean</li>\n     * <li>'int' - DERInteger</li>\n     * <li>'bitstr' - DERBitString</li>\n     * <li>'octstr' - DEROctetString</li>\n     * <li>'null' - DERNull</li>\n     * <li>'oid' - DERObjectIdentifier</li>\n     * <li>'enum' - DEREnumerated</li>\n     * <li>'utf8str' - DERUTF8String</li>\n     * <li>'numstr' - DERNumericString</li>\n     * <li>'prnstr' - DERPrintableString</li>\n     * <li>'telstr' - DERTeletexString</li>\n     * <li>'ia5str' - DERIA5String</li>\n     * <li>'utctime' - DERUTCTime</li>\n     * <li>'gentime' - DERGeneralizedTime</li>\n     * <li>'seq' - DERSequence</li>\n     * <li>'set' - DERSet</li>\n     * <li>'tag' - DERTaggedObject</li>\n     * </ul>\n     * @example\n     * newObject({'prnstr': 'aaa'});\n     * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]})\n     * // ASN.1 Tagged Object\n     * newObject({'tag': {'tag': 'a1',\n     *                    'explicit': true,\n     *                    'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}});\n     * // more simple representation of ASN.1 Tagged Object\n     * newObject({'tag': ['a1',\n     *                    true,\n     *                    {'seq': [\n     *                      {'int': 3},\n     *                      {'prnstr': 'aaa'}]}\n     *                   ]});\n     */\n    this.newObject = function (param) {\n        var _KJUR = KJUR, _KJUR_asn1 = _KJUR.asn1, _DERBoolean = _KJUR_asn1.DERBoolean, _DERInteger = _KJUR_asn1.DERInteger, _DERBitString = _KJUR_asn1.DERBitString, _DEROctetString = _KJUR_asn1.DEROctetString, _DERNull = _KJUR_asn1.DERNull, _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier, _DEREnumerated = _KJUR_asn1.DEREnumerated, _DERUTF8String = _KJUR_asn1.DERUTF8String, _DERNumericString = _KJUR_asn1.DERNumericString, _DERPrintableString = _KJUR_asn1.DERPrintableString, _DERTeletexString = _KJUR_asn1.DERTeletexString, _DERIA5String = _KJUR_asn1.DERIA5String, _DERUTCTime = _KJUR_asn1.DERUTCTime, _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime, _DERSequence = _KJUR_asn1.DERSequence, _DERSet = _KJUR_asn1.DERSet, _DERTaggedObject = _KJUR_asn1.DERTaggedObject, _newObject = _KJUR_asn1.ASN1Util.newObject;\n        var keys = Object.keys(param);\n        if (keys.length != 1)\n            throw \"key of param shall be only one.\";\n        var key = keys[0];\n        if (\":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:\".indexOf(\":\" + key + \":\") == -1)\n            throw \"undefined key: \" + key;\n        if (key == \"bool\")\n            return new _DERBoolean(param[key]);\n        if (key == \"int\")\n            return new _DERInteger(param[key]);\n        if (key == \"bitstr\")\n            return new _DERBitString(param[key]);\n        if (key == \"octstr\")\n            return new _DEROctetString(param[key]);\n        if (key == \"null\")\n            return new _DERNull(param[key]);\n        if (key == \"oid\")\n            return new _DERObjectIdentifier(param[key]);\n        if (key == \"enum\")\n            return new _DEREnumerated(param[key]);\n        if (key == \"utf8str\")\n            return new _DERUTF8String(param[key]);\n        if (key == \"numstr\")\n            return new _DERNumericString(param[key]);\n        if (key == \"prnstr\")\n            return new _DERPrintableString(param[key]);\n        if (key == \"telstr\")\n            return new _DERTeletexString(param[key]);\n        if (key == \"ia5str\")\n            return new _DERIA5String(param[key]);\n        if (key == \"utctime\")\n            return new _DERUTCTime(param[key]);\n        if (key == \"gentime\")\n            return new _DERGeneralizedTime(param[key]);\n        if (key == \"seq\") {\n            var paramList = param[key];\n            var a = [];\n            for (var i = 0; i < paramList.length; i++) {\n                var asn1Obj = _newObject(paramList[i]);\n                a.push(asn1Obj);\n            }\n            return new _DERSequence({ 'array': a });\n        }\n        if (key == \"set\") {\n            var paramList = param[key];\n            var a = [];\n            for (var i = 0; i < paramList.length; i++) {\n                var asn1Obj = _newObject(paramList[i]);\n                a.push(asn1Obj);\n            }\n            return new _DERSet({ 'array': a });\n        }\n        if (key == \"tag\") {\n            var tagParam = param[key];\n            if (Object.prototype.toString.call(tagParam) === '[object Array]' &&\n                tagParam.length == 3) {\n                var obj = _newObject(tagParam[2]);\n                return new _DERTaggedObject({\n                    tag: tagParam[0],\n                    explicit: tagParam[1],\n                    obj: obj\n                });\n            }\n            else {\n                var newParam = {};\n                if (tagParam.explicit !== undefined)\n                    newParam.explicit = tagParam.explicit;\n                if (tagParam.tag !== undefined)\n                    newParam.tag = tagParam.tag;\n                if (tagParam.obj === undefined)\n                    throw \"obj shall be specified for 'tag'.\";\n                newParam.obj = _newObject(tagParam.obj);\n                return new _DERTaggedObject(newParam);\n            }\n        }\n    };\n    /**\n     * get encoded hexadecimal string of ASN1Object specifed by JSON parameters\n     * @name jsonToASN1HEX\n     * @memberOf KJUR.asn1.ASN1Util\n     * @function\n     * @param {Array} param JSON parameter to generate ASN1Object\n     * @return hexadecimal string of ASN1Object\n     * @since asn1 1.0.4\n     * @description\n     * As for ASN.1 object representation of JSON object,\n     * please see {@link newObject}.\n     * @example\n     * jsonToASN1HEX({'prnstr': 'aaa'});\n     */\n    this.jsonToASN1HEX = function (param) {\n        var asn1Obj = this.newObject(param);\n        return asn1Obj.getEncodedHex();\n    };\n};\n/**\n * get dot noted oid number string from hexadecimal value of OID\n * @name oidHexToInt\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {String} hex hexadecimal value of object identifier\n * @return {String} dot noted string of object identifier\n * @since jsrsasign 4.8.3 asn1 1.0.7\n * @description\n * This static method converts from hexadecimal string representation of\n * ASN.1 value of object identifier to oid number string.\n * @example\n * KJUR.asn1.ASN1Util.oidHexToInt('550406') &rarr; \"2.5.4.6\"\n */\nKJUR.asn1.ASN1Util.oidHexToInt = function (hex) {\n    var s = \"\";\n    var i01 = parseInt(hex.substring(0, 2), 16);\n    var i0 = Math.floor(i01 / 40);\n    var i1 = i01 % 40;\n    var s = i0 + \".\" + i1;\n    var binbuf = \"\";\n    for (var i = 2; i < hex.length; i += 2) {\n        var value = parseInt(hex.substring(i, i + 2), 16);\n        var bin = (\"00000000\" + value.toString(2)).slice(-8);\n        binbuf = binbuf + bin.substring(1, 8);\n        if (bin.substring(0, 1) == \"0\") {\n            var bi = new BigInteger(binbuf, 2);\n            s = s + \".\" + bi.toString(10);\n            binbuf = \"\";\n        }\n    }\n    ;\n    return s;\n};\n/**\n * get hexadecimal value of object identifier from dot noted oid value\n * @name oidIntToHex\n * @memberOf KJUR.asn1.ASN1Util\n * @function\n * @param {String} oidString dot noted string of object identifier\n * @return {String} hexadecimal value of object identifier\n * @since jsrsasign 4.8.3 asn1 1.0.7\n * @description\n * This static method converts from object identifier value string.\n * to hexadecimal string representation of it.\n * @example\n * KJUR.asn1.ASN1Util.oidIntToHex(\"2.5.4.6\") &rarr; \"550406\"\n */\nKJUR.asn1.ASN1Util.oidIntToHex = function (oidString) {\n    var itox = function (i) {\n        var h = i.toString(16);\n        if (h.length == 1)\n            h = '0' + h;\n        return h;\n    };\n    var roidtox = function (roid) {\n        var h = '';\n        var bi = new BigInteger(roid, 10);\n        var b = bi.toString(2);\n        var padLen = 7 - b.length % 7;\n        if (padLen == 7)\n            padLen = 0;\n        var bPad = '';\n        for (var i = 0; i < padLen; i++)\n            bPad += '0';\n        b = bPad + b;\n        for (var i = 0; i < b.length - 1; i += 7) {\n            var b8 = b.substring(i, i + 7);\n            if (i != b.length - 7)\n                b8 = '1' + b8;\n            h += itox(parseInt(b8, 2));\n        }\n        return h;\n    };\n    if (!oidString.match(/^[0-9.]+$/)) {\n        throw \"malformed oid string: \" + oidString;\n    }\n    var h = '';\n    var a = oidString.split('.');\n    var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);\n    h += itox(i0);\n    a.splice(0, 2);\n    for (var i = 0; i < a.length; i++) {\n        h += roidtox(a[i]);\n    }\n    return h;\n};\n// ********************************************************************\n//  Abstract ASN.1 Classes\n// ********************************************************************\n// ********************************************************************\n/**\n * base class for ASN.1 DER encoder object\n * @name KJUR.asn1.ASN1Object\n * @class base class for ASN.1 DER encoder object\n * @property {Boolean} isModified flag whether internal data was changed\n * @property {String} hTLV hexadecimal string of ASN.1 TLV\n * @property {String} hT hexadecimal string of ASN.1 TLV tag(T)\n * @property {String} hL hexadecimal string of ASN.1 TLV length(L)\n * @property {String} hV hexadecimal string of ASN.1 TLV value(V)\n * @description\n */\nKJUR.asn1.ASN1Object = function () {\n    var isModified = true;\n    var hTLV = null;\n    var hT = '00';\n    var hL = '00';\n    var hV = '';\n    /**\n     * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V)\n     * @name getLengthHexFromValue\n     * @memberOf KJUR.asn1.ASN1Object#\n     * @function\n     * @return {String} hexadecimal string of ASN.1 TLV length(L)\n     */\n    this.getLengthHexFromValue = function () {\n        if (typeof this.hV == \"undefined\" || this.hV == null) {\n            throw \"this.hV is null or undefined.\";\n        }\n        if (this.hV.length % 2 == 1) {\n            throw \"value hex must be even length: n=\" + hV.length + \",v=\" + this.hV;\n        }\n        var n = this.hV.length / 2;\n        var hN = n.toString(16);\n        if (hN.length % 2 == 1) {\n            hN = \"0\" + hN;\n        }\n        if (n < 128) {\n            return hN;\n        }\n        else {\n            var hNlen = hN.length / 2;\n            if (hNlen > 15) {\n                throw \"ASN.1 length too long to represent by 8x: n = \" + n.toString(16);\n            }\n            var head = 128 + hNlen;\n            return head.toString(16) + hN;\n        }\n    };\n    /**\n     * get hexadecimal string of ASN.1 TLV bytes\n     * @name getEncodedHex\n     * @memberOf KJUR.asn1.ASN1Object#\n     * @function\n     * @return {String} hexadecimal string of ASN.1 TLV\n     */\n    this.getEncodedHex = function () {\n        if (this.hTLV == null || this.isModified) {\n            this.hV = this.getFreshValueHex();\n            this.hL = this.getLengthHexFromValue();\n            this.hTLV = this.hT + this.hL + this.hV;\n            this.isModified = false;\n            //alert(\"first time: \" + this.hTLV);\n        }\n        return this.hTLV;\n    };\n    /**\n     * get hexadecimal string of ASN.1 TLV value(V) bytes\n     * @name getValueHex\n     * @memberOf KJUR.asn1.ASN1Object#\n     * @function\n     * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes\n     */\n    this.getValueHex = function () {\n        this.getEncodedHex();\n        return this.hV;\n    };\n    this.getFreshValueHex = function () {\n        return '';\n    };\n};\n// == BEGIN DERAbstractString ================================================\n/**\n * base class for ASN.1 DER string classes\n * @name KJUR.asn1.DERAbstractString\n * @class base class for ASN.1 DER string classes\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @property {String} s internal string of value\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>str - specify initial ASN.1 value(V) by a string</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERAbstractString = function (params) {\n    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);\n    var s = null;\n    var hV = null;\n    /**\n     * get string value of this string object\n     * @name getString\n     * @memberOf KJUR.asn1.DERAbstractString#\n     * @function\n     * @return {String} string value of this string object\n     */\n    this.getString = function () {\n        return this.s;\n    };\n    /**\n     * set value by a string\n     * @name setString\n     * @memberOf KJUR.asn1.DERAbstractString#\n     * @function\n     * @param {String} newS value by a string to set\n     */\n    this.setString = function (newS) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.s = newS;\n        this.hV = stohex(this.s);\n    };\n    /**\n     * set value by a hexadecimal string\n     * @name setStringHex\n     * @memberOf KJUR.asn1.DERAbstractString#\n     * @function\n     * @param {String} newHexString value by a hexadecimal string to set\n     */\n    this.setStringHex = function (newHexString) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.s = null;\n        this.hV = newHexString;\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n    if (typeof params != \"undefined\") {\n        if (typeof params == \"string\") {\n            this.setString(params);\n        }\n        else if (typeof params['str'] != \"undefined\") {\n            this.setString(params['str']);\n        }\n        else if (typeof params['hex'] != \"undefined\") {\n            this.setStringHex(params['hex']);\n        }\n    }\n};\nextendClass(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);\n// == END   DERAbstractString ================================================\n// == BEGIN DERAbstractTime ==================================================\n/**\n * base class for ASN.1 DER Generalized/UTCTime class\n * @name KJUR.asn1.DERAbstractTime\n * @class base class for ASN.1 DER Generalized/UTCTime class\n * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERAbstractTime = function (params) {\n    KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);\n    var s = null;\n    var date = null;\n    // --- PRIVATE METHODS --------------------\n    this.localDateToUTC = function (d) {\n        utc = d.getTime() + (d.getTimezoneOffset() * 60000);\n        var utcDate = new Date(utc);\n        return utcDate;\n    };\n    /*\n     * format date string by Data object\n     * @name formatDate\n     * @memberOf KJUR.asn1.AbstractTime;\n     * @param {Date} dateObject\n     * @param {string} type 'utc' or 'gen'\n     * @param {boolean} withMillis flag for with millisections or not\n     * @description\n     * 'withMillis' flag is supported from asn1 1.0.6.\n     */\n    this.formatDate = function (dateObject, type, withMillis) {\n        var pad = this.zeroPadding;\n        var d = this.localDateToUTC(dateObject);\n        var year = String(d.getFullYear());\n        if (type == 'utc')\n            year = year.substring(2, 4);\n        var month = pad(String(d.getMonth() + 1), 2);\n        var day = pad(String(d.getDate()), 2);\n        var hour = pad(String(d.getHours()), 2);\n        var min = pad(String(d.getMinutes()), 2);\n        var sec = pad(String(d.getSeconds()), 2);\n        var s = year + month + day + hour + min + sec;\n        if (withMillis === true) {\n            var millis = d.getMilliseconds();\n            if (millis != 0) {\n                var sMillis = pad(String(millis), 3);\n                sMillis = sMillis.replace(/[0]+$/, \"\");\n                s = s + \".\" + sMillis;\n            }\n        }\n        return s + \"Z\";\n    };\n    this.zeroPadding = function (s, len) {\n        if (s.length >= len)\n            return s;\n        return new Array(len - s.length + 1).join('0') + s;\n    };\n    // --- PUBLIC METHODS --------------------\n    /**\n     * get string value of this string object\n     * @name getString\n     * @memberOf KJUR.asn1.DERAbstractTime#\n     * @function\n     * @return {String} string value of this time object\n     */\n    this.getString = function () {\n        return this.s;\n    };\n    /**\n     * set value by a string\n     * @name setString\n     * @memberOf KJUR.asn1.DERAbstractTime#\n     * @function\n     * @param {String} newS value by a string to set such like \"130430235959Z\"\n     */\n    this.setString = function (newS) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.s = newS;\n        this.hV = stohex(newS);\n    };\n    /**\n     * set value by a Date object\n     * @name setByDateValue\n     * @memberOf KJUR.asn1.DERAbstractTime#\n     * @function\n     * @param {Integer} year year of date (ex. 2013)\n     * @param {Integer} month month of date between 1 and 12 (ex. 12)\n     * @param {Integer} day day of month\n     * @param {Integer} hour hours of date\n     * @param {Integer} min minutes of date\n     * @param {Integer} sec seconds of date\n     */\n    this.setByDateValue = function (year, month, day, hour, min, sec) {\n        var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0));\n        this.setByDate(dateObject);\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n};\nextendClass(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);\n// == END   DERAbstractTime ==================================================\n// == BEGIN DERAbstractStructured ============================================\n/**\n * base class for ASN.1 DER structured class\n * @name KJUR.asn1.DERAbstractStructured\n * @class base class for ASN.1 DER structured class\n * @property {Array} asn1Array internal array of ASN1Object\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERAbstractStructured = function (params) {\n    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);\n    var asn1Array = null;\n    /**\n     * set value by array of ASN1Object\n     * @name setByASN1ObjectArray\n     * @memberOf KJUR.asn1.DERAbstractStructured#\n     * @function\n     * @param {array} asn1ObjectArray array of ASN1Object to set\n     */\n    this.setByASN1ObjectArray = function (asn1ObjectArray) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.asn1Array = asn1ObjectArray;\n    };\n    /**\n     * append an ASN1Object to internal array\n     * @name appendASN1Object\n     * @memberOf KJUR.asn1.DERAbstractStructured#\n     * @function\n     * @param {ASN1Object} asn1Object to add\n     */\n    this.appendASN1Object = function (asn1Object) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.asn1Array.push(asn1Object);\n    };\n    this.asn1Array = new Array();\n    if (typeof params != \"undefined\") {\n        if (typeof params['array'] != \"undefined\") {\n            this.asn1Array = params['array'];\n        }\n    }\n};\nextendClass(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);\n// ********************************************************************\n//  ASN.1 Object Classes\n// ********************************************************************\n// ********************************************************************\n/**\n * class for ASN.1 DER Boolean\n * @name KJUR.asn1.DERBoolean\n * @class class for ASN.1 DER Boolean\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERBoolean = function () {\n    KJUR.asn1.DERBoolean.superclass.constructor.call(this);\n    this.hT = \"01\";\n    this.hTLV = \"0101ff\";\n};\nextendClass(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);\n// ********************************************************************\n/**\n * class for ASN.1 DER Integer\n * @name KJUR.asn1.DERInteger\n * @class class for ASN.1 DER Integer\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>int - specify initial ASN.1 value(V) by integer value</li>\n * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERInteger = function (params) {\n    KJUR.asn1.DERInteger.superclass.constructor.call(this);\n    this.hT = \"02\";\n    /**\n     * set value by Tom Wu's BigInteger object\n     * @name setByBigInteger\n     * @memberOf KJUR.asn1.DERInteger#\n     * @function\n     * @param {BigInteger} bigIntegerValue to set\n     */\n    this.setByBigInteger = function (bigIntegerValue) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);\n    };\n    /**\n     * set value by integer value\n     * @name setByInteger\n     * @memberOf KJUR.asn1.DERInteger\n     * @function\n     * @param {Integer} integer value to set\n     */\n    this.setByInteger = function (intValue) {\n        var bi = new BigInteger(String(intValue), 10);\n        this.setByBigInteger(bi);\n    };\n    /**\n     * set value by integer value\n     * @name setValueHex\n     * @memberOf KJUR.asn1.DERInteger#\n     * @function\n     * @param {String} hexadecimal string of integer value\n     * @description\n     * <br/>\n     * NOTE: Value shall be represented by minimum octet length of\n     * two's complement representation.\n     * @example\n     * new KJUR.asn1.DERInteger(123);\n     * new KJUR.asn1.DERInteger({'int': 123});\n     * new KJUR.asn1.DERInteger({'hex': '1fad'});\n     */\n    this.setValueHex = function (newHexString) {\n        this.hV = newHexString;\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n    if (typeof params != \"undefined\") {\n        if (typeof params['bigint'] != \"undefined\") {\n            this.setByBigInteger(params['bigint']);\n        }\n        else if (typeof params['int'] != \"undefined\") {\n            this.setByInteger(params['int']);\n        }\n        else if (typeof params == \"number\") {\n            this.setByInteger(params);\n        }\n        else if (typeof params['hex'] != \"undefined\") {\n            this.setValueHex(params['hex']);\n        }\n    }\n};\nextendClass(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);\n// ********************************************************************\n/**\n * class for ASN.1 DER encoded BitString primitive\n * @name KJUR.asn1.DERBitString\n * @class class for ASN.1 DER encoded BitString primitive\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>bin - specify binary string (ex. '10111')</li>\n * <li>array - specify array of boolean (ex. [true,false,true,true])</li>\n * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li>\n * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject}\n * argument for \"BitString encapsulates\" structure.</li>\n * </ul>\n * NOTE1: 'params' can be omitted.<br/>\n * NOTE2: 'obj' parameter have been supported since\n * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/>\n * @example\n * // default constructor\n * o = new KJUR.asn1.DERBitString();\n * // initialize with binary string\n * o = new KJUR.asn1.DERBitString({bin: \"1011\"});\n * // initialize with boolean array\n * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]});\n * // initialize with hexadecimal string (04 is unused bits)\n * o = new KJUR.asn1.DEROctetString({hex: \"04bac0\"});\n * // initialize with ASN1Util.newObject argument for encapsulated\n * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});\n * // above generates a ASN.1 data like this:\n * // BIT STRING, encapsulates {\n * //   SEQUENCE {\n * //     INTEGER 3\n * //     PrintableString 'aaa'\n * //     }\n * //   }\n */\nKJUR.asn1.DERBitString = function (params) {\n    if (params !== undefined && typeof params.obj !== \"undefined\") {\n        var o = KJUR.asn1.ASN1Util.newObject(params.obj);\n        params.hex = \"00\" + o.getEncodedHex();\n    }\n    KJUR.asn1.DERBitString.superclass.constructor.call(this);\n    this.hT = \"03\";\n    /**\n     * set ASN.1 value(V) by a hexadecimal string including unused bits\n     * @name setHexValueIncludingUnusedBits\n     * @memberOf KJUR.asn1.DERBitString#\n     * @function\n     * @param {String} newHexStringIncludingUnusedBits\n     */\n    this.setHexValueIncludingUnusedBits = function (newHexStringIncludingUnusedBits) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.hV = newHexStringIncludingUnusedBits;\n    };\n    /**\n     * set ASN.1 value(V) by unused bit and hexadecimal string of value\n     * @name setUnusedBitsAndHexValue\n     * @memberOf KJUR.asn1.DERBitString#\n     * @function\n     * @param {Integer} unusedBits\n     * @param {String} hValue\n     */\n    this.setUnusedBitsAndHexValue = function (unusedBits, hValue) {\n        if (unusedBits < 0 || 7 < unusedBits) {\n            throw \"unused bits shall be from 0 to 7: u = \" + unusedBits;\n        }\n        var hUnusedBits = \"0\" + unusedBits;\n        this.hTLV = null;\n        this.isModified = true;\n        this.hV = hUnusedBits + hValue;\n    };\n    /**\n     * set ASN.1 DER BitString by binary string<br/>\n     * @name setByBinaryString\n     * @memberOf KJUR.asn1.DERBitString#\n     * @function\n     * @param {String} binaryString binary value string (i.e. '10111')\n     * @description\n     * Its unused bits will be calculated automatically by length of\n     * 'binaryValue'. <br/>\n     * NOTE: Trailing zeros '0' will be ignored.\n     * @example\n     * o = new KJUR.asn1.DERBitString();\n     * o.setByBooleanArray(\"01011\");\n     */\n    this.setByBinaryString = function (binaryString) {\n        binaryString = binaryString.replace(/0+$/, '');\n        var unusedBits = 8 - binaryString.length % 8;\n        if (unusedBits == 8)\n            unusedBits = 0;\n        for (var i = 0; i <= unusedBits; i++) {\n            binaryString += '0';\n        }\n        var h = '';\n        for (var i = 0; i < binaryString.length - 1; i += 8) {\n            var b = binaryString.substring(i, i + 8);\n            var x = parseInt(b, 2).toString(16);\n            if (x.length == 1)\n                x = '0' + x;\n            h += x;\n        }\n        this.hTLV = null;\n        this.isModified = true;\n        this.hV = '0' + unusedBits + h;\n    };\n    /**\n     * set ASN.1 TLV value(V) by an array of boolean<br/>\n     * @name setByBooleanArray\n     * @memberOf KJUR.asn1.DERBitString#\n     * @function\n     * @param {array} booleanArray array of boolean (ex. [true, false, true])\n     * @description\n     * NOTE: Trailing falses will be ignored in the ASN.1 DER Object.\n     * @example\n     * o = new KJUR.asn1.DERBitString();\n     * o.setByBooleanArray([false, true, false, true, true]);\n     */\n    this.setByBooleanArray = function (booleanArray) {\n        var s = '';\n        for (var i = 0; i < booleanArray.length; i++) {\n            if (booleanArray[i] == true) {\n                s += '1';\n            }\n            else {\n                s += '0';\n            }\n        }\n        this.setByBinaryString(s);\n    };\n    /**\n     * generate an array of falses with specified length<br/>\n     * @name newFalseArray\n     * @memberOf KJUR.asn1.DERBitString\n     * @function\n     * @param {Integer} nLength length of array to generate\n     * @return {array} array of boolean falses\n     * @description\n     * This static method may be useful to initialize boolean array.\n     * @example\n     * o = new KJUR.asn1.DERBitString();\n     * o.newFalseArray(3) &rarr; [false, false, false]\n     */\n    this.newFalseArray = function (nLength) {\n        var a = new Array(nLength);\n        for (var i = 0; i < nLength; i++) {\n            a[i] = false;\n        }\n        return a;\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n    if (typeof params != \"undefined\") {\n        if (typeof params == \"string\" && params.toLowerCase().match(/^[0-9a-f]+$/)) {\n            this.setHexValueIncludingUnusedBits(params);\n        }\n        else if (typeof params['hex'] != \"undefined\") {\n            this.setHexValueIncludingUnusedBits(params['hex']);\n        }\n        else if (typeof params['bin'] != \"undefined\") {\n            this.setByBinaryString(params['bin']);\n        }\n        else if (typeof params['array'] != \"undefined\") {\n            this.setByBooleanArray(params['array']);\n        }\n    }\n};\nextendClass(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);\n// ********************************************************************\n/**\n * class for ASN.1 DER OctetString<br/>\n * @name KJUR.asn1.DEROctetString\n * @class class for ASN.1 DER OctetString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * This class provides ASN.1 OctetString simple type.<br/>\n * Supported \"params\" attributes are:\n * <ul>\n * <li>str - to set a string as a value</li>\n * <li>hex - to set a hexadecimal string as a value</li>\n * <li>obj - to set a encapsulated ASN.1 value by JSON object\n * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li>\n * </ul>\n * NOTE: A parameter 'obj' have been supported\n * for \"OCTET STRING, encapsulates\" structure.\n * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).\n * @see KJUR.asn1.DERAbstractString - superclass\n * @example\n * // default constructor\n * o = new KJUR.asn1.DEROctetString();\n * // initialize with string\n * o = new KJUR.asn1.DEROctetString({str: \"aaa\"});\n * // initialize with hexadecimal string\n * o = new KJUR.asn1.DEROctetString({hex: \"616161\"});\n * // initialize with ASN1Util.newObject argument\n * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});\n * // above generates a ASN.1 data like this:\n * // OCTET STRING, encapsulates {\n * //   SEQUENCE {\n * //     INTEGER 3\n * //     PrintableString 'aaa'\n * //     }\n * //   }\n */\nKJUR.asn1.DEROctetString = function (params) {\n    if (params !== undefined && typeof params.obj !== \"undefined\") {\n        var o = KJUR.asn1.ASN1Util.newObject(params.obj);\n        params.hex = o.getEncodedHex();\n    }\n    KJUR.asn1.DEROctetString.superclass.constructor.call(this, params);\n    this.hT = \"04\";\n};\nextendClass(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);\n// ********************************************************************\n/**\n * class for ASN.1 DER Null\n * @name KJUR.asn1.DERNull\n * @class class for ASN.1 DER Null\n * @extends KJUR.asn1.ASN1Object\n * @description\n * @see KJUR.asn1.ASN1Object - superclass\n */\nKJUR.asn1.DERNull = function () {\n    KJUR.asn1.DERNull.superclass.constructor.call(this);\n    this.hT = \"05\";\n    this.hTLV = \"0500\";\n};\nextendClass(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);\n// ********************************************************************\n/**\n * class for ASN.1 DER ObjectIdentifier\n * @name KJUR.asn1.DERObjectIdentifier\n * @class class for ASN.1 DER ObjectIdentifier\n * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'})\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERObjectIdentifier = function (params) {\n    var itox = function (i) {\n        var h = i.toString(16);\n        if (h.length == 1)\n            h = '0' + h;\n        return h;\n    };\n    var roidtox = function (roid) {\n        var h = '';\n        var bi = new BigInteger(roid, 10);\n        var b = bi.toString(2);\n        var padLen = 7 - b.length % 7;\n        if (padLen == 7)\n            padLen = 0;\n        var bPad = '';\n        for (var i = 0; i < padLen; i++)\n            bPad += '0';\n        b = bPad + b;\n        for (var i = 0; i < b.length - 1; i += 7) {\n            var b8 = b.substring(i, i + 7);\n            if (i != b.length - 7)\n                b8 = '1' + b8;\n            h += itox(parseInt(b8, 2));\n        }\n        return h;\n    };\n    KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);\n    this.hT = \"06\";\n    /**\n     * set value by a hexadecimal string\n     * @name setValueHex\n     * @memberOf KJUR.asn1.DERObjectIdentifier#\n     * @function\n     * @param {String} newHexString hexadecimal value of OID bytes\n     */\n    this.setValueHex = function (newHexString) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.s = null;\n        this.hV = newHexString;\n    };\n    /**\n     * set value by a OID string<br/>\n     * @name setValueOidString\n     * @memberOf KJUR.asn1.DERObjectIdentifier#\n     * @function\n     * @param {String} oidString OID string (ex. 2.5.4.13)\n     * @example\n     * o = new KJUR.asn1.DERObjectIdentifier();\n     * o.setValueOidString(\"2.5.4.13\");\n     */\n    this.setValueOidString = function (oidString) {\n        if (!oidString.match(/^[0-9.]+$/)) {\n            throw \"malformed oid string: \" + oidString;\n        }\n        var h = '';\n        var a = oidString.split('.');\n        var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);\n        h += itox(i0);\n        a.splice(0, 2);\n        for (var i = 0; i < a.length; i++) {\n            h += roidtox(a[i]);\n        }\n        this.hTLV = null;\n        this.isModified = true;\n        this.s = null;\n        this.hV = h;\n    };\n    /**\n     * set value by a OID name\n     * @name setValueName\n     * @memberOf KJUR.asn1.DERObjectIdentifier#\n     * @function\n     * @param {String} oidName OID name (ex. 'serverAuth')\n     * @since 1.0.1\n     * @description\n     * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'.\n     * Otherwise raise error.\n     * @example\n     * o = new KJUR.asn1.DERObjectIdentifier();\n     * o.setValueName(\"serverAuth\");\n     */\n    this.setValueName = function (oidName) {\n        var oid = KJUR.asn1.x509.OID.name2oid(oidName);\n        if (oid !== '') {\n            this.setValueOidString(oid);\n        }\n        else {\n            throw \"DERObjectIdentifier oidName undefined: \" + oidName;\n        }\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n    if (params !== undefined) {\n        if (typeof params === \"string\") {\n            if (params.match(/^[0-2].[0-9.]+$/)) {\n                this.setValueOidString(params);\n            }\n            else {\n                this.setValueName(params);\n            }\n        }\n        else if (params.oid !== undefined) {\n            this.setValueOidString(params.oid);\n        }\n        else if (params.hex !== undefined) {\n            this.setValueHex(params.hex);\n        }\n        else if (params.name !== undefined) {\n            this.setValueName(params.name);\n        }\n    }\n};\nextendClass(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);\n// ********************************************************************\n/**\n * class for ASN.1 DER Enumerated\n * @name KJUR.asn1.DEREnumerated\n * @class class for ASN.1 DER Enumerated\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>int - specify initial ASN.1 value(V) by integer value</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n * @example\n * new KJUR.asn1.DEREnumerated(123);\n * new KJUR.asn1.DEREnumerated({int: 123});\n * new KJUR.asn1.DEREnumerated({hex: '1fad'});\n */\nKJUR.asn1.DEREnumerated = function (params) {\n    KJUR.asn1.DEREnumerated.superclass.constructor.call(this);\n    this.hT = \"0a\";\n    /**\n     * set value by Tom Wu's BigInteger object\n     * @name setByBigInteger\n     * @memberOf KJUR.asn1.DEREnumerated#\n     * @function\n     * @param {BigInteger} bigIntegerValue to set\n     */\n    this.setByBigInteger = function (bigIntegerValue) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);\n    };\n    /**\n     * set value by integer value\n     * @name setByInteger\n     * @memberOf KJUR.asn1.DEREnumerated#\n     * @function\n     * @param {Integer} integer value to set\n     */\n    this.setByInteger = function (intValue) {\n        var bi = new BigInteger(String(intValue), 10);\n        this.setByBigInteger(bi);\n    };\n    /**\n     * set value by integer value\n     * @name setValueHex\n     * @memberOf KJUR.asn1.DEREnumerated#\n     * @function\n     * @param {String} hexadecimal string of integer value\n     * @description\n     * <br/>\n     * NOTE: Value shall be represented by minimum octet length of\n     * two's complement representation.\n     */\n    this.setValueHex = function (newHexString) {\n        this.hV = newHexString;\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n    if (typeof params != \"undefined\") {\n        if (typeof params['int'] != \"undefined\") {\n            this.setByInteger(params['int']);\n        }\n        else if (typeof params == \"number\") {\n            this.setByInteger(params);\n        }\n        else if (typeof params['hex'] != \"undefined\") {\n            this.setValueHex(params['hex']);\n        }\n    }\n};\nextendClass(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);\n// ********************************************************************\n/**\n * class for ASN.1 DER UTF8String\n * @name KJUR.asn1.DERUTF8String\n * @class class for ASN.1 DER UTF8String\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERUTF8String = function (params) {\n    KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params);\n    this.hT = \"0c\";\n};\nextendClass(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);\n// ********************************************************************\n/**\n * class for ASN.1 DER NumericString\n * @name KJUR.asn1.DERNumericString\n * @class class for ASN.1 DER NumericString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERNumericString = function (params) {\n    KJUR.asn1.DERNumericString.superclass.constructor.call(this, params);\n    this.hT = \"12\";\n};\nextendClass(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);\n// ********************************************************************\n/**\n * class for ASN.1 DER PrintableString\n * @name KJUR.asn1.DERPrintableString\n * @class class for ASN.1 DER PrintableString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERPrintableString = function (params) {\n    KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params);\n    this.hT = \"13\";\n};\nextendClass(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);\n// ********************************************************************\n/**\n * class for ASN.1 DER TeletexString\n * @name KJUR.asn1.DERTeletexString\n * @class class for ASN.1 DER TeletexString\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERTeletexString = function (params) {\n    KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params);\n    this.hT = \"14\";\n};\nextendClass(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);\n// ********************************************************************\n/**\n * class for ASN.1 DER IA5String\n * @name KJUR.asn1.DERIA5String\n * @class class for ASN.1 DER IA5String\n * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})\n * @extends KJUR.asn1.DERAbstractString\n * @description\n * @see KJUR.asn1.DERAbstractString - superclass\n */\nKJUR.asn1.DERIA5String = function (params) {\n    KJUR.asn1.DERIA5String.superclass.constructor.call(this, params);\n    this.hT = \"16\";\n};\nextendClass(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);\n// ********************************************************************\n/**\n * class for ASN.1 DER UTCTime\n * @name KJUR.asn1.DERUTCTime\n * @class class for ASN.1 DER UTCTime\n * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})\n * @extends KJUR.asn1.DERAbstractTime\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * <li>date - specify Date object.</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n * <h4>EXAMPLES</h4>\n * @example\n * d1 = new KJUR.asn1.DERUTCTime();\n * d1.setString('130430125959Z');\n *\n * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'});\n * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))});\n * d4 = new KJUR.asn1.DERUTCTime('130430125959Z');\n */\nKJUR.asn1.DERUTCTime = function (params) {\n    KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params);\n    this.hT = \"17\";\n    /**\n     * set value by a Date object<br/>\n     * @name setByDate\n     * @memberOf KJUR.asn1.DERUTCTime#\n     * @function\n     * @param {Date} dateObject Date object to set ASN.1 value(V)\n     * @example\n     * o = new KJUR.asn1.DERUTCTime();\n     * o.setByDate(new Date(\"2016/12/31\"));\n     */\n    this.setByDate = function (dateObject) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.date = dateObject;\n        this.s = this.formatDate(this.date, 'utc');\n        this.hV = stohex(this.s);\n    };\n    this.getFreshValueHex = function () {\n        if (typeof this.date == \"undefined\" && typeof this.s == \"undefined\") {\n            this.date = new Date();\n            this.s = this.formatDate(this.date, 'utc');\n            this.hV = stohex(this.s);\n        }\n        return this.hV;\n    };\n    if (params !== undefined) {\n        if (params.str !== undefined) {\n            this.setString(params.str);\n        }\n        else if (typeof params == \"string\" && params.match(/^[0-9]{12}Z$/)) {\n            this.setString(params);\n        }\n        else if (params.hex !== undefined) {\n            this.setStringHex(params.hex);\n        }\n        else if (params.date !== undefined) {\n            this.setByDate(params.date);\n        }\n    }\n};\nextendClass(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);\n// ********************************************************************\n/**\n * class for ASN.1 DER GeneralizedTime\n * @name KJUR.asn1.DERGeneralizedTime\n * @class class for ASN.1 DER GeneralizedTime\n * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'})\n * @property {Boolean} withMillis flag to show milliseconds or not\n * @extends KJUR.asn1.DERAbstractTime\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li>\n * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>\n * <li>date - specify Date object.</li>\n * <li>millis - specify flag to show milliseconds (from 1.0.6)</li>\n * </ul>\n * NOTE1: 'params' can be omitted.\n * NOTE2: 'withMillis' property is supported from asn1 1.0.6.\n */\nKJUR.asn1.DERGeneralizedTime = function (params) {\n    KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params);\n    this.hT = \"18\";\n    this.withMillis = false;\n    /**\n     * set value by a Date object\n     * @name setByDate\n     * @memberOf KJUR.asn1.DERGeneralizedTime#\n     * @function\n     * @param {Date} dateObject Date object to set ASN.1 value(V)\n     * @example\n     * When you specify UTC time, use 'Date.UTC' method like this:<br/>\n     * o1 = new DERUTCTime();\n     * o1.setByDate(date);\n     *\n     * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59\n     */\n    this.setByDate = function (dateObject) {\n        this.hTLV = null;\n        this.isModified = true;\n        this.date = dateObject;\n        this.s = this.formatDate(this.date, 'gen', this.withMillis);\n        this.hV = stohex(this.s);\n    };\n    this.getFreshValueHex = function () {\n        if (this.date === undefined && this.s === undefined) {\n            this.date = new Date();\n            this.s = this.formatDate(this.date, 'gen', this.withMillis);\n            this.hV = stohex(this.s);\n        }\n        return this.hV;\n    };\n    if (params !== undefined) {\n        if (params.str !== undefined) {\n            this.setString(params.str);\n        }\n        else if (typeof params == \"string\" && params.match(/^[0-9]{14}Z$/)) {\n            this.setString(params);\n        }\n        else if (params.hex !== undefined) {\n            this.setStringHex(params.hex);\n        }\n        else if (params.date !== undefined) {\n            this.setByDate(params.date);\n        }\n        if (params.millis === true) {\n            this.withMillis = true;\n        }\n    }\n};\nextendClass(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);\n// ********************************************************************\n/**\n * class for ASN.1 DER Sequence\n * @name KJUR.asn1.DERSequence\n * @class class for ASN.1 DER Sequence\n * @extends KJUR.asn1.DERAbstractStructured\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>array - specify array of ASN1Object to set elements of content</li>\n * </ul>\n * NOTE: 'params' can be omitted.\n */\nKJUR.asn1.DERSequence = function (params) {\n    KJUR.asn1.DERSequence.superclass.constructor.call(this, params);\n    this.hT = \"30\";\n    this.getFreshValueHex = function () {\n        var h = '';\n        for (var i = 0; i < this.asn1Array.length; i++) {\n            var asn1Obj = this.asn1Array[i];\n            h += asn1Obj.getEncodedHex();\n        }\n        this.hV = h;\n        return this.hV;\n    };\n};\nextendClass(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);\n// ********************************************************************\n/**\n * class for ASN.1 DER Set\n * @name KJUR.asn1.DERSet\n * @class class for ASN.1 DER Set\n * @extends KJUR.asn1.DERAbstractStructured\n * @description\n * <br/>\n * As for argument 'params' for constructor, you can specify one of\n * following properties:\n * <ul>\n * <li>array - specify array of ASN1Object to set elements of content</li>\n * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li>\n * </ul>\n * NOTE1: 'params' can be omitted.<br/>\n * NOTE2: sortflag is supported since 1.0.5.\n */\nKJUR.asn1.DERSet = function (params) {\n    KJUR.asn1.DERSet.superclass.constructor.call(this, params);\n    this.hT = \"31\";\n    this.sortFlag = true; // item shall be sorted only in ASN.1 DER\n    this.getFreshValueHex = function () {\n        var a = new Array();\n        for (var i = 0; i < this.asn1Array.length; i++) {\n            var asn1Obj = this.asn1Array[i];\n            a.push(asn1Obj.getEncodedHex());\n        }\n        if (this.sortFlag == true)\n            a.sort();\n        this.hV = a.join('');\n        return this.hV;\n    };\n    if (typeof params != \"undefined\") {\n        if (typeof params.sortflag != \"undefined\" &&\n            params.sortflag == false)\n            this.sortFlag = false;\n    }\n};\nextendClass(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);\n// ********************************************************************\n/**\n * class for ASN.1 DER TaggedObject\n * @name KJUR.asn1.DERTaggedObject\n * @class class for ASN.1 DER TaggedObject\n * @extends KJUR.asn1.ASN1Object\n * @description\n * <br/>\n * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object.\n * For example, if you find '[1]' tag in a ASN.1 dump,\n * 'tagNoHex' will be 'a1'.\n * <br/>\n * As for optional argument 'params' for constructor, you can specify *ANY* of\n * following properties:\n * <ul>\n * <li>explicit - specify true if this is explicit tag otherwise false\n *     (default is 'true').</li>\n * <li>tag - specify tag (default is 'a0' which means [0])</li>\n * <li>obj - specify ASN1Object which is tagged</li>\n * </ul>\n * @example\n * d1 = new KJUR.asn1.DERUTF8String({'str':'a'});\n * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1});\n * hex = d2.getEncodedHex();\n */\nKJUR.asn1.DERTaggedObject = function (params) {\n    KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);\n    this.hT = \"a0\";\n    this.hV = '';\n    this.isExplicit = true;\n    this.asn1Object = null;\n    /**\n     * set value by an ASN1Object\n     * @name setString\n     * @memberOf KJUR.asn1.DERTaggedObject#\n     * @function\n     * @param {Boolean} isExplicitFlag flag for explicit/implicit tag\n     * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag\n     * @param {ASN1Object} asn1Object ASN.1 to encapsulate\n     */\n    this.setASN1Object = function (isExplicitFlag, tagNoHex, asn1Object) {\n        this.hT = tagNoHex;\n        this.isExplicit = isExplicitFlag;\n        this.asn1Object = asn1Object;\n        if (this.isExplicit) {\n            this.hV = this.asn1Object.getEncodedHex();\n            this.hTLV = null;\n            this.isModified = true;\n        }\n        else {\n            this.hV = null;\n            this.hTLV = asn1Object.getEncodedHex();\n            this.hTLV = this.hTLV.replace(/^../, tagNoHex);\n            this.isModified = false;\n        }\n    };\n    this.getFreshValueHex = function () {\n        return this.hV;\n    };\n    if (typeof params != \"undefined\") {\n        if (typeof params['tag'] != \"undefined\") {\n            this.hT = params['tag'];\n        }\n        if (typeof params['explicit'] != \"undefined\") {\n            this.isExplicit = params['explicit'];\n        }\n        if (typeof params['obj'] != \"undefined\") {\n            this.asn1Object = params['obj'];\n            this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);\n        }\n    }\n};\nextendClass(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);\n","var __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    };\n    return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n            throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nimport { hex2b64 } from \"./lib/jsbn/base64\";\nimport { Hex } from \"./lib/asn1js/hex\";\nimport { Base64 } from \"./lib/asn1js/base64\";\nimport { ASN1 } from \"./lib/asn1js/asn1\";\nimport { RSAKey } from \"./lib/jsbn/rsa\";\nimport { parseBigInt } from \"./lib/jsbn/jsbn\";\nimport { KJUR } from \"./lib/jsrsasign/asn1-1.0\";\n/**\n * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.\n * This object is just a decorator for parsing the key parameter\n * @param {string|Object} key - The key in string format, or an object containing\n * the parameters needed to build a RSAKey object.\n * @constructor\n */\nvar JSEncryptRSAKey = /** @class */ (function (_super) {\n    __extends(JSEncryptRSAKey, _super);\n    function JSEncryptRSAKey(key) {\n        var _this = _super.call(this) || this;\n        // Call the super constructor.\n        //  RSAKey.call(this);\n        // If a key key was provided.\n        if (key) {\n            // If this is a string...\n            if (typeof key === \"string\") {\n                _this.parseKey(key);\n            }\n            else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||\n                JSEncryptRSAKey.hasPublicKeyProperty(key)) {\n                // Set the values for the key.\n                _this.parsePropertiesFrom(key);\n            }\n        }\n        return _this;\n    }\n    /**\n     * Method to parse a pem encoded string containing both a public or private key.\n     * The method will translate the pem encoded string in a der encoded string and\n     * will parse private key and public key parameters. This method accepts public key\n     * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).\n     *\n     * @todo Check how many rsa formats use the same format of pkcs #1.\n     *\n     * The format is defined as:\n     * PublicKeyInfo ::= SEQUENCE {\n     *   algorithm       AlgorithmIdentifier,\n     *   PublicKey       BIT STRING\n     * }\n     * Where AlgorithmIdentifier is:\n     * AlgorithmIdentifier ::= SEQUENCE {\n     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm\n     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)\n     * }\n     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING\n     * RSAPublicKey ::= SEQUENCE {\n     *   modulus           INTEGER,  -- n\n     *   publicExponent    INTEGER   -- e\n     * }\n     * it's possible to examine the structure of the keys obtained from openssl using\n     * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/\n     * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer\n     * @private\n     */\n    JSEncryptRSAKey.prototype.parseKey = function (pem) {\n        try {\n            var modulus = 0;\n            var public_exponent = 0;\n            var reHex = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/;\n            var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);\n            var asn1 = ASN1.decode(der);\n            // Fixes a bug with OpenSSL 1.0+ private keys\n            if (asn1.sub.length === 3) {\n                asn1 = asn1.sub[2].sub[0];\n            }\n            if (asn1.sub.length === 9) {\n                // Parse the private key.\n                modulus = asn1.sub[1].getHexStringValue(); // bigint\n                this.n = parseBigInt(modulus, 16);\n                public_exponent = asn1.sub[2].getHexStringValue(); // int\n                this.e = parseInt(public_exponent, 16);\n                var private_exponent = asn1.sub[3].getHexStringValue(); // bigint\n                this.d = parseBigInt(private_exponent, 16);\n                var prime1 = asn1.sub[4].getHexStringValue(); // bigint\n                this.p = parseBigInt(prime1, 16);\n                var prime2 = asn1.sub[5].getHexStringValue(); // bigint\n                this.q = parseBigInt(prime2, 16);\n                var exponent1 = asn1.sub[6].getHexStringValue(); // bigint\n                this.dmp1 = parseBigInt(exponent1, 16);\n                var exponent2 = asn1.sub[7].getHexStringValue(); // bigint\n                this.dmq1 = parseBigInt(exponent2, 16);\n                var coefficient = asn1.sub[8].getHexStringValue(); // bigint\n                this.coeff = parseBigInt(coefficient, 16);\n            }\n            else if (asn1.sub.length === 2) {\n                if (asn1.sub[0].sub) {\n                    // Parse ASN.1 SubjectPublicKeyInfo type as defined by X.509\n                    var bit_string = asn1.sub[1];\n                    var sequence = bit_string.sub[0];\n                    modulus = sequence.sub[0].getHexStringValue();\n                    this.n = parseBigInt(modulus, 16);\n                    public_exponent = sequence.sub[1].getHexStringValue();\n                    this.e = parseInt(public_exponent, 16);\n                }\n                else {\n                    // Parse ASN.1 RSAPublicKey type as defined by PKCS #1\n                    modulus = asn1.sub[0].getHexStringValue();\n                    this.n = parseBigInt(modulus, 16);\n                    public_exponent = asn1.sub[1].getHexStringValue();\n                    this.e = parseInt(public_exponent, 16);\n                }\n            }\n            else {\n                return false;\n            }\n            return true;\n        }\n        catch (ex) {\n            return false;\n        }\n    };\n    /**\n     * Translate rsa parameters in a hex encoded string representing the rsa key.\n     *\n     * The translation follow the ASN.1 notation :\n     * RSAPrivateKey ::= SEQUENCE {\n     *   version           Version,\n     *   modulus           INTEGER,  -- n\n     *   publicExponent    INTEGER,  -- e\n     *   privateExponent   INTEGER,  -- d\n     *   prime1            INTEGER,  -- p\n     *   prime2            INTEGER,  -- q\n     *   exponent1         INTEGER,  -- d mod (p1)\n     *   exponent2         INTEGER,  -- d mod (q-1)\n     *   coefficient       INTEGER,  -- (inverse of q) mod p\n     * }\n     * @returns {string}  DER Encoded String representing the rsa private key\n     * @private\n     */\n    JSEncryptRSAKey.prototype.getPrivateBaseKey = function () {\n        var options = {\n            array: [\n                new KJUR.asn1.DERInteger({ int: 0 }),\n                new KJUR.asn1.DERInteger({ bigint: this.n }),\n                new KJUR.asn1.DERInteger({ int: this.e }),\n                new KJUR.asn1.DERInteger({ bigint: this.d }),\n                new KJUR.asn1.DERInteger({ bigint: this.p }),\n                new KJUR.asn1.DERInteger({ bigint: this.q }),\n                new KJUR.asn1.DERInteger({ bigint: this.dmp1 }),\n                new KJUR.asn1.DERInteger({ bigint: this.dmq1 }),\n                new KJUR.asn1.DERInteger({ bigint: this.coeff }),\n            ],\n        };\n        var seq = new KJUR.asn1.DERSequence(options);\n        return seq.getEncodedHex();\n    };\n    /**\n     * base64 (pem) encoded version of the DER encoded representation\n     * @returns {string} pem encoded representation without header and footer\n     * @public\n     */\n    JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function () {\n        return hex2b64(this.getPrivateBaseKey());\n    };\n    /**\n     * Translate rsa parameters in a hex encoded string representing the rsa public key.\n     * The representation follow the ASN.1 notation :\n     * PublicKeyInfo ::= SEQUENCE {\n     *   algorithm       AlgorithmIdentifier,\n     *   PublicKey       BIT STRING\n     * }\n     * Where AlgorithmIdentifier is:\n     * AlgorithmIdentifier ::= SEQUENCE {\n     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm\n     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)\n     * }\n     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING\n     * RSAPublicKey ::= SEQUENCE {\n     *   modulus           INTEGER,  -- n\n     *   publicExponent    INTEGER   -- e\n     * }\n     * @returns {string} DER Encoded String representing the rsa public key\n     * @private\n     */\n    JSEncryptRSAKey.prototype.getPublicBaseKey = function () {\n        var first_sequence = new KJUR.asn1.DERSequence({\n            array: [\n                new KJUR.asn1.DERObjectIdentifier({ oid: \"1.2.840.113549.1.1.1\" }), // RSA Encryption pkcs #1 oid\n                new KJUR.asn1.DERNull(),\n            ],\n        });\n        var second_sequence = new KJUR.asn1.DERSequence({\n            array: [\n                new KJUR.asn1.DERInteger({ bigint: this.n }),\n                new KJUR.asn1.DERInteger({ int: this.e }),\n            ],\n        });\n        var bit_string = new KJUR.asn1.DERBitString({\n            hex: \"00\" + second_sequence.getEncodedHex(),\n        });\n        var seq = new KJUR.asn1.DERSequence({\n            array: [first_sequence, bit_string],\n        });\n        return seq.getEncodedHex();\n    };\n    /**\n     * base64 (pem) encoded version of the DER encoded representation\n     * @returns {string} pem encoded representation without header and footer\n     * @public\n     */\n    JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function () {\n        return hex2b64(this.getPublicBaseKey());\n    };\n    /**\n     * wrap the string in block of width chars. The default value for rsa keys is 64\n     * characters.\n     * @param {string} str the pem encoded string without header and footer\n     * @param {Number} [width=64] - the length the string has to be wrapped at\n     * @returns {string}\n     * @private\n     */\n    JSEncryptRSAKey.wordwrap = function (str, width) {\n        width = width || 64;\n        if (!str) {\n            return str;\n        }\n        var regex = \"(.{1,\" + width + \"})( +|$\\n?)|(.{1,\" + width + \"})\";\n        return str.match(RegExp(regex, \"g\")).join(\"\\n\");\n    };\n    /**\n     * Retrieve the pem encoded private key\n     * @returns {string} the pem encoded private key with header/footer\n     * @public\n     */\n    JSEncryptRSAKey.prototype.getPrivateKey = function () {\n        var key = \"-----BEGIN RSA PRIVATE KEY-----\\n\";\n        key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + \"\\n\";\n        key += \"-----END RSA PRIVATE KEY-----\";\n        return key;\n    };\n    /**\n     * Retrieve the pem encoded public key\n     * @returns {string} the pem encoded public key with header/footer\n     * @public\n     */\n    JSEncryptRSAKey.prototype.getPublicKey = function () {\n        var key = \"-----BEGIN PUBLIC KEY-----\\n\";\n        key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + \"\\n\";\n        key += \"-----END PUBLIC KEY-----\";\n        return key;\n    };\n    /**\n     * Check if the object contains the necessary parameters to populate the rsa modulus\n     * and public exponent parameters.\n     * @param {Object} [obj={}] - An object that may contain the two public key\n     * parameters\n     * @returns {boolean} true if the object contains both the modulus and the public exponent\n     * properties (n and e)\n     * @todo check for types of n and e. N should be a parseable bigInt object, E should\n     * be a parseable integer number\n     * @private\n     */\n    JSEncryptRSAKey.hasPublicKeyProperty = function (obj) {\n        obj = obj || {};\n        return obj.hasOwnProperty(\"n\") && obj.hasOwnProperty(\"e\");\n    };\n    /**\n     * Check if the object contains ALL the parameters of an RSA key.\n     * @param {Object} [obj={}] - An object that may contain nine rsa key\n     * parameters\n     * @returns {boolean} true if the object contains all the parameters needed\n     * @todo check for types of the parameters all the parameters but the public exponent\n     * should be parseable bigint objects, the public exponent should be a parseable integer number\n     * @private\n     */\n    JSEncryptRSAKey.hasPrivateKeyProperty = function (obj) {\n        obj = obj || {};\n        return (obj.hasOwnProperty(\"n\") &&\n            obj.hasOwnProperty(\"e\") &&\n            obj.hasOwnProperty(\"d\") &&\n            obj.hasOwnProperty(\"p\") &&\n            obj.hasOwnProperty(\"q\") &&\n            obj.hasOwnProperty(\"dmp1\") &&\n            obj.hasOwnProperty(\"dmq1\") &&\n            obj.hasOwnProperty(\"coeff\"));\n    };\n    /**\n     * Parse the properties of obj in the current rsa object. Obj should AT LEAST\n     * include the modulus and public exponent (n, e) parameters.\n     * @param {Object} obj - the object containing rsa parameters\n     * @private\n     */\n    JSEncryptRSAKey.prototype.parsePropertiesFrom = function (obj) {\n        this.n = obj.n;\n        this.e = obj.e;\n        if (obj.hasOwnProperty(\"d\")) {\n            this.d = obj.d;\n            this.p = obj.p;\n            this.q = obj.q;\n            this.dmp1 = obj.dmp1;\n            this.dmq1 = obj.dmq1;\n            this.coeff = obj.coeff;\n        }\n    };\n    return JSEncryptRSAKey;\n}(RSAKey));\nexport { JSEncryptRSAKey };\n","var _a;\nimport { b64tohex, hex2b64 } from \"./lib/jsbn/base64\";\nimport { JSEncryptRSAKey } from \"./JSEncryptRSAKey\";\nimport { oaep_pad } from './lib/jsbn/rsa';\nimport { rstr_sha256, rstr2hex } from './lib/jsbn/sha256';\nvar version = typeof process !== \"undefined\" ? (_a = process.env) === null || _a === void 0 ? void 0 : _a.npm_package_version : undefined;\n/**\n *\n * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour\n * possible parameters are:\n * - key                     {JSEncryptRSAKey}  default: null\n * - default_key_size        {number}  default: 1024 the key size in bit\n * - default_public_exponent {string}  default: '010001' the hexadecimal representation of the public exponent\n * - log                     {boolean} default: false whether log warn/error or not\n * @constructor\n */\nvar JSEncrypt = /** @class */ (function () {\n    function JSEncrypt(options) {\n        if (options === void 0) { options = {}; }\n        this.default_key_size = options.default_key_size\n            ? parseInt(options.default_key_size, 10)\n            : 1024;\n        this.default_public_exponent = options.default_public_exponent || \"010001\"; // 65537 default openssl public exponent for rsa key type\n        this.log = options.log || false;\n        // The private and public key.\n        this.key = options.key || null;\n    }\n    /**\n     * Method to set the rsa key parameter (one method is enough to set both the public\n     * and the private key, since the private key contains the public key paramenters)\n     * Log a warning if logs are enabled\n     * @param {Object|string} key the pem encoded string or an object (with or without header/footer)\n     * @public\n     */\n    JSEncrypt.prototype.setKey = function (key) {\n        if (key) {\n            if (this.log && this.key) {\n                console.warn(\"A key was already set, overriding existing.\");\n            }\n            this.key = new JSEncryptRSAKey(key);\n        }\n        else if (!this.key && this.log) {\n            console.error(\"A key was not set.\");\n        }\n    };\n    /**\n     * Proxy method for setKey, for api compatibility\n     * @see setKey\n     * @public\n     */\n    JSEncrypt.prototype.setPrivateKey = function (privkey) {\n        // Create the key.\n        this.setKey(privkey);\n    };\n    /**\n     * Proxy method for setKey, for api compatibility\n     * @see setKey\n     * @public\n     */\n    JSEncrypt.prototype.setPublicKey = function (pubkey) {\n        // Sets the public key.\n        this.setKey(pubkey);\n    };\n    /**\n     * Proxy method for RSAKey object's decrypt, decrypt the string using the private\n     * components of the rsa key object. Note that if the object was not set will be created\n     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n     * @param {string} str base64 encoded crypted string to decrypt\n     * @return {string} the decrypted string\n     * @public\n     */\n    JSEncrypt.prototype.decrypt = function (str) {\n        // Return the decrypted string.\n        try {\n            return this.getKey().decrypt(b64tohex(str));\n        }\n        catch (ex) {\n            return false;\n        }\n    };\n    /**\n     * Proxy method for RSAKey object's encrypt, encrypt the string using the public\n     * components of the rsa key object. Note that if the object was not set will be created\n     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n     * @param {string} str the string to encrypt\n     * @return {string} the encrypted string encoded in base64\n     * @public\n     */\n    JSEncrypt.prototype.encrypt = function (str) {\n        // Return the encrypted string.\n        try {\n            return hex2b64(this.getKey().encrypt(str));\n        }\n        catch (ex) {\n            return false;\n        }\n    };\n    /**\n     * Proxy method for RSAKey object's encrypt with padding: RSA_PKCS1_OAEP_PADDING and oaepHash: sha256,\n     * encrypt the string using the public\n     * components of the rsa key object. Note that if the object was not set will be created\n     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n     * @param {string} str the string to encrypt\n     * @return {string} the encrypted string encoded in base64\n     * @public\n     */\n    JSEncrypt.prototype.encryptOAEP = function (str) {\n        // Return the encrypted string.\n        try {\n            return hex2b64(this.getKey().encrypt(str, oaep_pad));\n        }\n        catch (ex) {\n            return false;\n        }\n    };\n    /**\n     * Proxy method for RSAKey object's sign.\n     * @param {string} str the string to sign\n     * @param {function} digestMethod hash method\n     * @param {string} digestName the name of the hash algorithm\n     * @return {string} the signature encoded in base64\n     * @public\n     */\n    JSEncrypt.prototype.sign = function (str, digestMethod, digestName) {\n        if (digestMethod === void 0) { digestMethod = function (raw) { return raw; }; }\n        if (digestName === void 0) { digestName = \"\"; }\n        // return the RSA signature of 'str' in 'hex' format.\n        try {\n            return hex2b64(this.getKey().sign(str, digestMethod, digestName));\n        }\n        catch (ex) {\n            return false;\n        }\n    };\n    /**\n     * Signs a string using the SHA-256 hash algorithm.\n     * @param str the string to sign\n     * @returns the base64 encoded signature or false on failure\n     */\n    JSEncrypt.prototype.signSha256 = function (str) {\n        return this.sign(str, function (text) {\n            return rstr2hex(rstr_sha256(text));\n        }, \"sha256\");\n    };\n    /**\n     * Proxy method for RSAKey object's verify.\n     * @param {string} str the string to verify\n     * @param {string} signature the signature encoded in base64 to compare the string to\n     * @param {function} digestMethod hash method\n     * @return {boolean} whether the data and signature match\n     * @public\n     */\n    JSEncrypt.prototype.verify = function (str, signature, digestMethod) {\n        if (digestMethod === void 0) { digestMethod = function (raw) { return raw; }; }\n        // Return the decrypted 'digest' of the signature.\n        try {\n            return this.getKey().verify(str, b64tohex(signature), digestMethod);\n        }\n        catch (ex) {\n            return false;\n        }\n    };\n    /**\n     * Verifies a string using the SHA-256 hash algorithm.\n     * @param str the string to verify\n     * @param signature the base64 encoded signature to compare against\n     * @returns whether the signature is valid\n     */\n    JSEncrypt.prototype.verifySha256 = function (str, signature) {\n        return this.verify(str, signature, function (text) {\n            return rstr2hex(rstr_sha256(text));\n        });\n    };\n    /**\n     * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object\n     * will be created and returned\n     * @param {callback} [cb] the callback to be called if we want the key to be generated\n     * in an async fashion\n     * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object\n     * @public\n     */\n    JSEncrypt.prototype.getKey = function (cb) {\n        // Only create new if it does not exist.\n        if (!this.key) {\n            // Get a new private key.\n            this.key = new JSEncryptRSAKey();\n            if (cb && {}.toString.call(cb) === \"[object Function]\") {\n                this.key.generateAsync(this.default_key_size, this.default_public_exponent, cb);\n                return;\n            }\n            // Generate the key.\n            this.key.generate(this.default_key_size, this.default_public_exponent);\n        }\n        return this.key;\n    };\n    /**\n     * Returns the pem encoded representation of the private key\n     * If the key doesn't exists a new key will be created\n     * @returns {string} pem encoded representation of the private key WITH header and footer\n     * @public\n     */\n    JSEncrypt.prototype.getPrivateKey = function () {\n        // Return the private representation of this key.\n        return this.getKey().getPrivateKey();\n    };\n    /**\n     * Returns the pem encoded representation of the private key\n     * If the key doesn't exists a new key will be created\n     * @returns {string} pem encoded representation of the private key WITHOUT header and footer\n     * @public\n     */\n    JSEncrypt.prototype.getPrivateKeyB64 = function () {\n        // Return the private representation of this key.\n        return this.getKey().getPrivateBaseKeyB64();\n    };\n    /**\n     * Returns the pem encoded representation of the public key\n     * If the key doesn't exists a new key will be created\n     * @returns {string} pem encoded representation of the public key WITH header and footer\n     * @public\n     */\n    JSEncrypt.prototype.getPublicKey = function () {\n        // Return the private representation of this key.\n        return this.getKey().getPublicKey();\n    };\n    /**\n     * Returns the pem encoded representation of the public key\n     * If the key doesn't exists a new key will be created\n     * @returns {string} pem encoded representation of the public key WITHOUT header and footer\n     * @public\n     */\n    JSEncrypt.prototype.getPublicKeyB64 = function () {\n        // Return the private representation of this key.\n        return this.getKey().getPublicBaseKeyB64();\n    };\n    JSEncrypt.version = version;\n    return JSEncrypt;\n}());\nexport { JSEncrypt };\n","import { JSEncrypt } from 'jsencrypt';\n\nconst PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9jCTgw894UN/h6Wztogq\nUMKgtBvE7TzNtEJQ1dfG4UxfoPh95cyXbm6tDd7pwbY1cG3q46iO0ITJl4XRJb+l\nsyg5c8Ed+fXrbfhs6hKYbMorNA+Cy2br0Zxv/7PbhHbte7v95xuLwYgniGdJ4Wpi\nri3BOboeo38EHFFig6CHntubv4GCbI5xfXB+EMJZZrBHujOJ/aIXQE2zf7gOQ9y6\nMvMB00l4AbXPWOXgnCqv7zDXFXg/sSxg7xxiBpIA8VHj2V0SGSNj07Y6eEnaAXT9\nwgAR5T5xVkw9Yr0PevD40qK/fQbyHxQzE1/5ufsNtP/vCwpOGTcI/LBotFjrEMWw\nrQIDAQAB\n-----END PUBLIC KEY-----`;\n\nexport function encryptPassword(password: string): string {\n  const encryptor = new JSEncrypt();\n  encryptor.setPublicKey(PUBLIC_KEY);\n  const encrypted = encryptor.encrypt(password);\n  if (!encrypted) {\n    throw new Error('Password encryption failed');\n  }\n  return encrypted;\n}\n","export function normalizeOAuthRedirectUrl(value: string): string {\n  const redirectUrl = value.trim();\n  const suffixIndex = redirectUrl.search(/[?#]/);\n  const base = suffixIndex === -1 ? redirectUrl : redirectUrl.slice(0, suffixIndex);\n  const suffix = suffixIndex === -1 ? '' : redirectUrl.slice(suffixIndex);\n\n  return `${base.replace(/\\/+$/, '')}${suffix}`;\n}\n","/**\n * 事件总线 — 发布/订阅模式\n */\nimport type { SSOEventType, SSOEventHandler } from '../types';\n\nclass EventBus {\n  private listeners: Map<SSOEventType, Set<SSOEventHandler>> = new Map();\n\n  /**\n   * 订阅事件\n   */\n  on(event: SSOEventType, handler: SSOEventHandler): () => void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    this.listeners.get(event)!.add(handler);\n\n    // 返回取消订阅函数\n    return () => {\n      this.listeners.get(event)?.delete(handler);\n    };\n  }\n\n  /**\n   * 触发事件\n   */\n  emit(event: SSOEventType, ...args: unknown[]): void {\n    const handlers = this.listeners.get(event);\n    if (handlers) {\n      handlers.forEach((handler) => {\n        try {\n          handler(...args);\n        } catch (e) {\n          console.error(`[VidauSSO] Event handler error for \"${event}\":`, e);\n        }\n      });\n    }\n  }\n\n  /**\n   * 移除所有事件监听\n   */\n  clear(): void {\n    this.listeners.clear();\n  }\n}\n\nexport const eventBus = new EventBus();\n","export const SESSION_SYNC_EVENT = 'vidau:sso-session-sync';\n\nexport interface SessionSyncDetail {\n  appId: string;\n  authenticated: boolean;\n  source: string;\n}\n\nconst sessionSyncSource = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n\nexport function getSessionSyncSource(): string {\n  return sessionSyncSource;\n}\n\nexport function broadcastSessionChange(appId: string | undefined, authenticated: boolean): void {\n  if (typeof window === 'undefined' || !appId) return;\n\n  window.dispatchEvent(\n    new CustomEvent<SessionSyncDetail>(SESSION_SYNC_EVENT, {\n      detail: { appId, authenticated, source: sessionSyncSource },\n    })\n  );\n}\n\nexport function subscribeToSessionSync(\n  handler: (detail: SessionSyncDetail) => void\n): () => void {\n  if (typeof window === 'undefined') return () => undefined;\n\n  const listener = (event: Event) => {\n    const detail = (event as CustomEvent<SessionSyncDetail>).detail;\n    if (!detail\n      || typeof detail.appId !== 'string'\n      || typeof detail.authenticated !== 'boolean'\n      || typeof detail.source !== 'string') return;\n    handler(detail);\n  };\n\n  window.addEventListener(SESSION_SYNC_EVENT, listener);\n  return () => window.removeEventListener(SESSION_SYNC_EVENT, listener);\n}\n","/**\n * 认证核心逻辑 — Token 管理、登录状态\n */\nimport { getConfig } from './config';\nimport { deleteCookie, parseJwtUserId } from './cookie';\nimport { eventBus } from './event-bus';\nimport { broadcastSessionChange } from './session-sync';\nimport * as api from './api';\nimport type { VidauUser, VidauSSOConfig } from '../types';\n\nlet currentUser: VidauUser | null = null;\nlet currentToken: string | null = null;\nlet isInitialized = false;\nlet userConfig: VidauSSOConfig | null = null;\nlet authRevision = 0;\nlet inflightUserInfo: Promise<VidauUser | null> | null = null;\nlet lastUserInfoAt = 0;\nconst USER_INFO_TTL_MS = 30_000;\n\n/**\n * 设置 SDK 配置\n */\nexport function setUserConfig(config: VidauSSOConfig): void {\n  userConfig = config;\n}\n\n/**\n * 获取 SDK 配置\n */\nexport function getUserConfig(): VidauSSOConfig | null {\n  return userConfig;\n}\n\n/**\n * 获取当前 Token\n */\nexport function getToken(): string | null {\n  return currentToken;\n}\n\n/**\n * 仅在当前页面生命周期内保留 Token。持久会话由服务端 HttpOnly Cookie 管理。\n */\nexport function saveToken(token: string): void {\n  currentToken = token;\n  authRevision += 1;\n}\n\n/**\n * 清除 Token\n */\nexport function clearToken(): void {\n  const config = getConfig();\n  // 清理升级前遗留的可读 Cookie；HttpOnly Cookie 由 logout API 清除。\n  deleteCookie(config.cookieName, config.cookieDomain);\n  currentToken = null;\n  currentUser = null;\n  lastUserInfoAt = 0;\n  inflightUserInfo = null;\n  authRevision += 1;\n}\n\n/**\n * 检查是否已登录\n */\nexport function isLoggedIn(): boolean {\n  return !!currentUser || !!currentToken;\n}\n\n/**\n * 获取当前用户\n */\nexport function getUser(): VidauUser | null {\n  return currentUser;\n}\n\n/**\n * 验证 Token 并获取用户信息。\n * 短时间内复用内存结果，避免打开 pricing 时再卡 2s 的 user-info。\n */\nexport async function validateAndFetchUser(options?: { force?: boolean }): Promise<VidauUser | null> {\n  if (!options?.force && currentUser && Date.now() - lastUserInfoAt < USER_INFO_TTL_MS) {\n    return currentUser;\n  }\n  if (inflightUserInfo) return inflightUserInfo;\n\n  const revision = authRevision;\n  inflightUserInfo = (async () => {\n    try {\n      const res = await api.getUserInfo(currentToken);\n      if (revision !== authRevision) return currentUser;\n      if (res.code === 0 && res.data) {\n        if (res.token) saveToken(res.token);\n        currentUser = res.data;\n        lastUserInfoAt = Date.now();\n        eventBus.emit('auth_change', true, currentUser);\n        return currentUser;\n      }\n      clearToken();\n      eventBus.emit('auth_change', false, null);\n      return null;\n    } catch {\n      // 网络错误，不清除 Token（可能是临时故障）\n      return currentUser;\n    } finally {\n      inflightUserInfo = null;\n    }\n  })();\n\n  return inflightUserInfo;\n}\n\n/**\n * 处理登录成功\n */\nexport function handleLoginSuccess(token: string, user?: VidauUser): void {\n  saveToken(token);\n\n  // 从 Token 中解析基本用户信息\n  const userId = parseJwtUserId(token);\n  currentUser = user || { id: userId, email: '' };\n\n  // 触发事件\n  eventBus.emit('login_success', currentUser, token);\n  eventBus.emit('auth_change', true, currentUser);\n  broadcastSessionChange(userConfig?.appId, true);\n\n  // 异步获取完整用户信息\n  void validateAndFetchUser({ force: true });\n}\n\n/**\n * 退出登录\n */\nexport async function logout(): Promise<void> {\n  await api.logout();\n  clearToken();\n  eventBus.emit('logout');\n  eventBus.emit('auth_change', false, null);\n  broadcastSessionChange(userConfig?.appId, false);\n}\n\n/**\n * 检查初始化状态\n */\nexport function getInitialized(): boolean {\n  return isInitialized;\n}\n\n/**\n * 设置初始化状态\n */\nexport function setInitialized(value: boolean): void {\n  isInitialized = value;\n}\n","/**\n * API 请求封装\n * 代理到 app-api.vidau.ai 的所有认证相关请求\n */\nimport { getConfig } from './config';\nimport { getAffiliateCode } from './affiliate';\nimport { getDevice } from './cookie';\nimport { encryptPassword } from './encrypt';\nimport { normalizeOAuthRedirectUrl } from './redirect-url';\nimport type { ApiResponse, LoginResponse, RegisterResponse, VidauUser } from '../types';\n\nlet debugMode = false;\n\nexport function setDebugMode(debug: boolean): void {\n  debugMode = debug;\n}\n\nfunction log(...args: unknown[]): void {\n  if (debugMode) {\n    console.log('[VidauSSO:API]', ...args);\n  }\n}\n\nimport { getUserConfig } from './auth';\n\nconst THIRD_PARTY_LOGIN_ENDPOINTS = new Set([\n  'google-login',\n  'google-one-tap-login',\n  'facebook-login',\n  'apple-login',\n  'microsoft-login',\n]);\n\nfunction getRedirectUrl(): string {\n  const redirectUrl = getUserConfig()?.redirectUrl\n    || (typeof window !== 'undefined' ? window.location.href : '');\n  return normalizeOAuthRedirectUrl(redirectUrl);\n}\n\n/**\n * 通用 API 请求\n */\nexport async function request<T>(\n  endpoint: string,\n  body: Record<string, unknown>,\n  headers?: Record<string, string>\n): Promise<ApiResponse<T>> {\n  const config = getConfig();\n  const userConfig = getUserConfig();\n  const appId = userConfig?.appId || '';\n  const url = `${config.apiBaseUrl}${endpoint}`;\n  const redirectUrl = userConfig?.redirectUrl\n    || (typeof window !== 'undefined' ? window.location.href : '');\n  const aff = getAffiliateCode();\n  const requestBody = {\n    ...body,\n    ...((endpoint === 'login' || endpoint === 'register' || THIRD_PARTY_LOGIN_ENDPOINTS.has(endpoint)) && aff ? { aff } : {}),\n    redirectUrl: THIRD_PARTY_LOGIN_ENDPOINTS.has(endpoint)\n      ? normalizeOAuthRedirectUrl(redirectUrl)\n      : redirectUrl,\n  };\n  \n  log(`POST ${url}`);\n\n  const res = await fetch(url, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'Device': getDevice(),\n      'X-App-Id': appId,\n      'X-App-Key': appId,\n      'lang': userConfig?.locale || 'en-US',\n      ...headers,\n    },\n    body: JSON.stringify(requestBody),\n    mode: 'cors',\n    credentials: 'include',\n  });\n\n  const data = await res.json();\n  log(`Response ${res.status} (${data?.code ?? 'unknown'})`);\n  if (!res.ok) throw new Error(data?.msg || `HTTP error! status: ${res.status}`);\n  return data as ApiResponse<T>;\n}\n\n/**\n * 检查邮箱是否已注册\n */\nexport async function checkEmail(email: string): Promise<boolean> {\n  const res = await request<{ hasReg: boolean }>('check-email', { email });\n  if (res.code === 0) {\n    return res.data.hasReg;\n  }\n  throw new Error(res.msg || 'Email check failed');\n}\n\nexport const NEED_LOGIN_VERIFY = -912;\n\nexport function isNeedLoginVerify(res: Pick<ApiResponse<{ need_verify?: boolean }>, 'code' | 'data'>): boolean {\n  if (res.code === NEED_LOGIN_VERIFY) {\n    return true;\n  }\n  return Boolean(res.data && res.data.need_verify);\n}\n\n/**\n * 邮箱密码登录\n */\nexport async function loginByEmail(\n  email: string,\n  password: string,\n  code?: string\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('login', {\n    email,\n    password: encryptPassword(password),\n    ...(code ? { code } : {}),\n  });\n}\n\n/**\n * 发送验证码\n */\nexport async function sendVerificationCode(\n  email: string,\n  type: 'register' | 'resetPassword' | 'login'\n): Promise<ApiResponse<unknown>> {\n  return request('send-code', {\n    email,\n    type,\n  });\n}\n\n/**\n * 邮箱注册（通过验证码）\n */\nexport async function registerByCode(\n  email: string,\n  password: string,\n  code: string\n): Promise<ApiResponse<RegisterResponse>> {\n  return request<RegisterResponse>('register', {\n    email,\n    password: encryptPassword(password),\n    code,\n  });\n}\n\n/**\n * 校验并重置密码\n */\nexport async function resetPassword(\n  email: string,\n  code: string,\n  password: string\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('reset-password', {\n    email,\n    code,\n    password: encryptPassword(password),\n  });\n}\n\n/**\n * Google 登录\n */\nexport async function googleLogin(\n  credential: string\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('google-login', {\n    code: credential,\n    successUrl: getRedirectUrl(),\n  });\n}\n\n/**\n * Google Identity Services personalized button / One Tap login\n */\nexport async function googleOneTapLogin(\n  credential: string\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('google-one-tap-login', {\n    credential,\n    successUrl: getRedirectUrl(),\n  });\n}\n\n/**\n * Facebook 登录\n */\nexport async function facebookLogin(\n  accessToken: string,\n  userID: string,\n  userInfo: Record<string, unknown>\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('facebook-login', {\n    accessToken,\n    userID,\n    userInfo,\n    backUrl: getRedirectUrl(),\n  });\n}\n\n/**\n * Apple 登录\n */\nexport async function appleLogin(\n  identityToken: string,\n  email?: string,\n  name?: string\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('apple-login', {\n    identityToken,\n    email,\n    name,\n    successUrl: getRedirectUrl(),\n  });\n}\n\n/**\n * Microsoft 登录\n */\nexport async function microsoftLogin(\n  idToken: string,\n  email?: string,\n  name?: string\n): Promise<ApiResponse<LoginResponse>> {\n  return request<LoginResponse>('microsoft-login', {\n    idToken,\n    email,\n    name,\n    successUrl: getRedirectUrl(),\n  });\n}\n\n/**\n * 获取用户信息\n */\nexport async function getUserInfo(token?: string | null): Promise<ApiResponse<VidauUser>> {\n  const headers = token ? {\n    'X-Token': token,\n    'Token': token,\n    'Authorization': token,\n  } : undefined;\n  return request<VidauUser>('user-info', {}, headers);\n}\n\nexport async function logout(): Promise<ApiResponse<unknown>> {\n  return request('logout', {});\n}\n","import { request } from './api';\nimport { getToken } from './auth';\n\nexport type PaymentChannel = 'STRIPE' | 'ANTOM' | 'HUIFU';\n\nexport interface PriceItem {\n  id?: number | string;\n  period?: number;\n  price?: number;\n  discount_price?: number;\n  currency?: string;\n  off_per?: number;\n  credits_per_month?: number;\n  rights?: string[];\n  can_use?: boolean;\n}\n\nexport interface PriceSetting {\n  id?: number | string;\n  vip_level?: number;\n  memo?: string;\n  prices?: Array<{\n    id?: number | string;\n    credits_per_month?: number;\n    rights?: string[];\n    off_per?: number;\n    price?: number;\n    discount_price?: number;\n    currency?: string;\n    period?: number;\n    can_use?: boolean;\n    price_items?: PriceItem[];\n  }>;\n}\n\nexport interface PricingPlan {\n  id: number | string;\n  name: string;\n  desc?: string;\n  settings?: PriceSetting[];\n}\n\nexport interface CoinPackage {\n  id: number;\n  coin_number: number;\n  price_usd: number;\n  currency?: string;\n}\n\nexport interface PaymentPayload {\n  payment_link?: string;\n  customData?: { paymentId?: string };\n  amount?: number;\n  currency?: string;\n}\n\nexport interface CreatedPayment {\n  payment?: PaymentPayload;\n  payment_id?: string;\n  strPaymentId?: string;\n}\n\nexport async function getPricing() {\n  return request<{ pricings?: PricingPlan[]; pay_channels?: PaymentChannel[] }>('pricing', {});\n}\n\nexport async function getCoinPackages() {\n  return request<CoinPackage[]>('coin-list', {});\n}\n\nexport async function getIpLocation() {\n  return request<{ countryCode?: string }>('ip', {});\n}\n\nexport async function createSubscriptionOrder(payload: Record<string, unknown>) {\n  return request<CreatedPayment>('create-subscription-order', payload);\n}\n\nexport async function createCoinOrder(payload: Record<string, unknown>) {\n  return request<CreatedPayment>('create-coin-order', payload);\n}\n\nexport async function getPaymentStatus(paymentId: string) {\n  return request<{ pay_status?: number }>('payment-status', { paymentId });\n}\n\nexport async function writeActivity(payload: {\n  activity_type: string;\n  action: string;\n  source?: string;\n  extra?: string;\n}) {\n  const token = getToken();\n  const headers = token\n    ? {\n        'X-Token': token,\n        Token: token,\n        Authorization: token,\n      }\n    : undefined;\n  return request('write-activity', payload, headers);\n}\n","import { isLoggedIn } from './auth';\nimport { writeActivity } from './pricing-api';\n\nconst PAGE_VIEW_KEY = 'vidau_pricing_page_view';\n\nexport function isPricingPagePath(pathname: string): boolean {\n  return /\\/pricing(?:\\/|$)/i.test(pathname) || /\\/vip-price(?:\\/|$)/i.test(pathname);\n}\n\nexport function writePricingDialogView(source?: string): void {\n  void writeActivity({\n    activity_type: 'pricing_dialog_view',\n    action: 'pricing',\n    source: source || 'other',\n  }).catch(() => undefined);\n}\n\nexport function trackPricingPageView(): void {\n  if (typeof window === 'undefined') return;\n  if (!isPricingPagePath(window.location.pathname)) return;\n  if (!isLoggedIn()) return;\n\n  const key = `${PAGE_VIEW_KEY}:${window.location.pathname}`;\n  try {\n    if (sessionStorage.getItem(key)) return;\n    sessionStorage.setItem(key, '1');\n  } catch {\n    // private mode still reports; duplicate risk is acceptable\n  }\n\n  void writeActivity({\n    activity_type: 'pricing_page_view',\n    action: 'pricing',\n  }).catch(() => undefined);\n}\n","/**\n * GA4 for SSO dialogs. Shares the official-site data stream and event names.\n *\n * Production hosts only: vidau.ai and *.vidau.ai with env=production.\n * Test (vidau.info, env=development, localhost) never load the production\n * Google tag.\n *\n * Owned-document events (iframe or sso.vidau.ai / other product hosts):\n *   signup_modal_view, pay_modal_view, signup_method_click\n * Official site (www.vidau.ai / vidau.ai, same document, no iframe):\n *   signup_method_click only — host already wraps login/register/openPricing.\n *\n * Never send sign_up / purchase / generate_success from the browser.\n */\nimport { getConfig, getEnv } from './config';\nimport { eventBus } from './event-bus';\nimport type { VidauUser } from '../types';\n\nexport const GA_MEASUREMENT_ID = 'G-GGH3R52CL0';\n/** Google tag supplied by the GA4 data stream; it routes browser events to GA4. */\nexport const GOOGLE_TAG_ID = 'AW-728190160';\nexport const GA_CLIENT_ID_COOKIE = 'vidau_ga_client_id';\nexport const GA_CLIENT_ID_DOMAIN = '.vidau.ai';\n\nexport type SignupMethod = 'google' | 'apple' | 'email' | 'microsoft' | 'facebook';\n\nconst METHOD_CLICK_DEDUPE_MS = 2000;\nconst GTAG_SCRIPT_ID = 'vidau-ga4';\n\ntype GtagFn = (...args: unknown[]) => void;\n\nlet cachedClientId = '';\nlet gtagLoadStarted = false;\nlet identityListenersBound = false;\nlet lastMethodClick: { method: string; at: number } | null = null;\n\nfunction currentHostname(): string {\n  return typeof window === 'undefined' ? '' : window.location.hostname;\n}\n\nfunction inBrowser(): boolean {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isProductionGaHost(hostname = currentHostname()): boolean {\n  return hostname === 'vidau.ai' || hostname.endsWith('.vidau.ai');\n}\n\nexport function canSendProductionGa(\n  hostname = currentHostname(),\n  env = getEnv(),\n  apiBaseUrl = getConfig().apiBaseUrl,\n): boolean {\n  if (env === 'development') return false;\n  if (hostname.includes('vidau.info')) return false;\n  if (String(apiBaseUrl || '').includes('vidau.info')) return false;\n  return isProductionGaHost(hostname);\n}\n\nexport function isOfficialMarketingHost(hostname = currentHostname()): boolean {\n  return hostname === 'www.vidau.ai' || hostname === 'vidau.ai';\n}\n\nexport function isEmbeddedInIframe(): boolean {\n  if (!inBrowser()) return false;\n  try {\n    return window.self !== window.top;\n  } catch {\n    return true;\n  }\n}\n\nexport function shouldSendOwnedModalViews(\n  hostname = currentHostname(),\n  inIframe = isEmbeddedInIframe(),\n  env = getEnv(),\n  apiBaseUrl = getConfig().apiBaseUrl,\n): boolean {\n  if (!canSendProductionGa(hostname, env, apiBaseUrl)) return false;\n  if (inIframe) return true;\n  return !isOfficialMarketingHost(hostname);\n}\n\nfunction readCookie(name: string): string {\n  if (!inBrowser()) return '';\n  const prefix = `${name}=`;\n  const match = document.cookie.split(';').map((part) => part.trim()).find((part) => part.startsWith(prefix));\n  if (!match) return '';\n  try {\n    return decodeURIComponent(match.slice(prefix.length));\n  } catch {\n    return match.slice(prefix.length);\n  }\n}\n\nfunction writeCookie(name: string, value: string): void {\n  if (!inBrowser() || !canSendProductionGa() || !value) return;\n  const secure = window.location.protocol === 'https:' ? ';Secure' : '';\n  document.cookie = `${name}=${encodeURIComponent(value)};path=/;domain=${GA_CLIENT_ID_DOMAIN};max-age=31536000;SameSite=Lax${secure}`;\n}\n\nfunction parseGaClientId(raw: string): string {\n  const parts = raw.split('.').filter(Boolean);\n  if (parts.length < 2) return '';\n  return `${parts[parts.length - 2]}.${parts[parts.length - 1]}`;\n}\n\nexport function readGaClientId(): string {\n  if (cachedClientId) return cachedClientId;\n  const stored = readCookie(GA_CLIENT_ID_COOKIE);\n  if (stored) {\n    cachedClientId = stored;\n    return stored;\n  }\n  const fromGa = parseGaClientId(readCookie('_ga'));\n  if (fromGa) {\n    cachedClientId = fromGa;\n    persistGaClientId(fromGa);\n    return fromGa;\n  }\n  return '';\n}\n\nfunction persistGaClientId(clientId: string): void {\n  if (!clientId) return;\n  cachedClientId = clientId;\n  writeCookie(GA_CLIENT_ID_COOKIE, clientId);\n}\n\nfunction clientIdParams(): Record<string, string> {\n  const clientId = readGaClientId();\n  if (!clientId) return {};\n  return { user_cookie_id: clientId, client_id: clientId };\n}\n\n/**\n * Stable page context for modal events. Query parameters are deliberately\n * omitted so the values can be registered as low-cardinality GA4 dimensions.\n */\nfunction triggerPageParams(): Record<string, string> {\n  if (!inBrowser()) return {};\n  return {\n    trigger_page_path: window.location.pathname || '/',\n    trigger_page_host: window.location.hostname.toLowerCase(),\n  };\n}\n\nfunction getGtag(): GtagFn | undefined {\n  if (!inBrowser()) return undefined;\n  return (window as Window & { gtag?: GtagFn }).gtag;\n}\n\nfunction requestGtagClientId(): void {\n  const gtag = getGtag();\n  if (typeof gtag !== 'function') return;\n  try {\n    gtag('get', GOOGLE_TAG_ID, 'client_id', (clientId: string) => {\n      if (typeof clientId === 'string' && clientId) persistGaClientId(clientId);\n    });\n  } catch {\n    // gtag get is best-effort; cookie fallback still applies.\n  }\n}\n\nfunction hostHasGtagScript(): boolean {\n  if (!inBrowser()) return false;\n  return Boolean(\n    document.getElementById(GTAG_SCRIPT_ID)\n    || document.querySelector('script[src*=\"googletagmanager.com/gtag/js\"]')\n  );\n}\n\nexport function ensureGtagLoaded(): void {\n  if (!inBrowser() || !canSendProductionGa()) return;\n\n  const win = window as Window & { dataLayer?: unknown[]; gtag?: GtagFn };\n  const hostScriptReady = hostHasGtagScript() && typeof win.gtag === 'function';\n  win.dataLayer = win.dataLayer || [];\n  if (typeof win.gtag !== 'function') {\n    win.gtag = function gtag(...args: unknown[]) {\n      win.dataLayer!.push(args);\n    };\n  }\n\n  if (hostScriptReady) {\n    gtagLoadStarted = true;\n    requestGtagClientId();\n    readGaClientId();\n    return;\n  }\n\n  if (!gtagLoadStarted && !hostHasGtagScript()) {\n    gtagLoadStarted = true;\n    win.gtag('js', new Date());\n    win.gtag('config', GOOGLE_TAG_ID, { send_page_view: false });\n    const script = document.createElement('script');\n    script.id = GTAG_SCRIPT_ID;\n    script.async = true;\n    script.src = `https://www.googletagmanager.com/gtag/js?id=${GOOGLE_TAG_ID}`;\n    script.addEventListener('load', () => requestGtagClientId());\n    document.head.appendChild(script);\n  } else {\n    requestGtagClientId();\n  }\n\n  readGaClientId();\n}\n\nfunction sendGaEvent(eventName: string, params: Record<string, unknown> = {}): boolean {\n  if (!canSendProductionGa()) return false;\n  ensureGtagLoaded();\n  const gtag = getGtag();\n  if (typeof gtag !== 'function') return false;\n  gtag('event', eventName, { ...clientIdParams(), ...params });\n  return true;\n}\n\nexport function initAnalytics(): void {\n  bindIdentityListeners();\n  if (!canSendProductionGa()) return;\n  ensureGtagLoaded();\n}\n\nexport function bindGaUser(userId?: string | number | null): void {\n  if (!canSendProductionGa()) return;\n  ensureGtagLoaded();\n  const gtag = getGtag();\n  if (typeof gtag !== 'function') return;\n  gtag('config', GOOGLE_TAG_ID, {\n    send_page_view: false,\n    user_id: userId == null || userId === '' ? '' : String(userId),\n  });\n}\n\nfunction bindIdentityListeners(): void {\n  if (identityListenersBound) return;\n  identityListenersBound = true;\n  eventBus.on('login_success', (user: unknown) => {\n    const id = (user as VidauUser | undefined)?.id;\n    if (id) bindGaUser(id);\n  });\n  eventBus.on('auth_change', (isLoggedIn: unknown, user: unknown) => {\n    if (isLoggedIn && (user as VidauUser | undefined)?.id) {\n      bindGaUser((user as VidauUser).id);\n      return;\n    }\n    if (!isLoggedIn) bindGaUser(null);\n  });\n  eventBus.on('logout', () => bindGaUser(null));\n}\n\nexport function trackSignupModalView(mode: 'login' | 'register'): void {\n  initAnalytics();\n  if (!shouldSendOwnedModalViews()) return;\n  sendGaEvent('signup_modal_view', { ...triggerPageParams(), mode });\n}\n\nexport function trackPayModalView(): void {\n  initAnalytics();\n  if (!shouldSendOwnedModalViews()) return;\n  sendGaEvent('pay_modal_view', triggerPageParams());\n}\n\nexport function trackSignupMethodClick(method: string): void {\n  const normalized = String(method || '').trim().toLowerCase();\n  if (!normalized) return;\n\n  const now = Date.now();\n  if (\n    lastMethodClick\n    && lastMethodClick.method === normalized\n    && now - lastMethodClick.at < METHOD_CLICK_DEDUPE_MS\n  ) {\n    return;\n  }\n  lastMethodClick = { method: normalized, at: now };\n\n  initAnalytics();\n  const pageParams = triggerPageParams();\n  const gaSent = sendGaEvent('signup_method_click', { ...pageParams, method: normalized });\n  const payload = {\n    method: normalized,\n    ga_sent: gaSent,\n    ...pageParams,\n    ...clientIdParams(),\n  };\n  eventBus.emit('signup_method_click', payload);\n  if (inBrowser()) {\n    window.dispatchEvent(new CustomEvent('vidau:signup_method_click', {\n      detail: payload,\n      bubbles: true,\n      composed: true,\n    }));\n  }\n}\n\nexport function resetAnalyticsBindings(): void {\n  identityListenersBound = false;\n}\n\nexport function resetAnalyticsStateForTests(): void {\n  cachedClientId = '';\n  gtagLoadStarted = false;\n  identityListenersBound = false;\n  lastMethodClick = null;\n}\n","const HTML_ENTITIES: Record<string, string> = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n};\n\nexport function escapeHtml(value: unknown): string {\n  return String(value ?? '').replace(/[&<>\"']/g, (char) => HTML_ENTITIES[char]);\n}\n\nexport function safeUrl(value: unknown, allowRelative = true): string {\n  const raw = String(value ?? '').trim();\n  if (!raw) return '';\n  if (allowRelative && raw.startsWith('/') && !raw.startsWith('//')) return raw;\n  try {\n    const url = new URL(raw);\n    return url.protocol === 'https:' || (url.protocol === 'http:' && ['localhost', '127.0.0.1'].includes(url.hostname))\n      ? url.href\n      : '';\n  } catch {\n    return '';\n  }\n}\n\nexport function safeCssColor(value: unknown, fallback: string): string {\n  const color = String(value ?? '').trim();\n  return /^(#[0-9a-f]{3,8}|[a-z]{3,20})$/i.test(color) ? color : fallback;\n}\n\nexport function sanitizeSvg(value: unknown): string {\n  const source = String(value ?? '').trim();\n  if (!source || typeof DOMParser === 'undefined') return '';\n\n  const allowedTags = new Set(['svg', 'g', 'path', 'circle', 'ellipse', 'rect', 'line', 'polyline', 'polygon']);\n  const allowedAttributes = new Set([\n    'viewBox', 'width', 'height', 'fill', 'fill-rule', 'clip-rule', 'stroke',\n    'stroke-width', 'stroke-linecap', 'stroke-linejoin', 'd', 'x', 'y', 'x1',\n    'x2', 'y1', 'y2', 'cx', 'cy', 'r', 'rx', 'ry', 'points', 'transform',\n    'opacity'\n  ]);\n  const doc = new DOMParser().parseFromString(source, 'image/svg+xml');\n  const root = doc.documentElement;\n  if (root.tagName.toLowerCase() !== 'svg' || root.querySelector('parsererror')) return '';\n\n  for (const element of Array.from(root.querySelectorAll('*'))) {\n    if (!allowedTags.has(element.tagName.toLowerCase())) {\n      element.remove();\n      continue;\n    }\n    for (const attribute of Array.from(element.attributes)) {\n      if (!allowedAttributes.has(attribute.name) || /url\\s*\\(/i.test(attribute.value)) {\n        element.removeAttribute(attribute.name);\n      }\n    }\n  }\n  for (const attribute of Array.from(root.attributes)) {\n    if (!allowedAttributes.has(attribute.name) || /url\\s*\\(/i.test(attribute.value)) {\n      root.removeAttribute(attribute.name);\n    }\n  }\n  return root.outerHTML;\n}\n","import * as api from '../core/api';\nimport { getConfig, initConfig } from '../core/config';\nimport { handleLoginSuccess } from '../core/auth';\nimport { eventBus } from '../core/event-bus';\nimport { getUserConfig, setUserConfig } from '../core/auth';\nimport {\n  initAnalytics,\n  trackSignupMethodClick,\n  trackSignupModalView,\n} from '../core/analytics';\nimport { escapeHtml, safeUrl } from '../core/sanitize';\nimport { normalizeOAuthRedirectUrl } from '../core/redirect-url';\nimport type { VidauUser } from '../types';\n\ntype AuthView = 'login' | 'login-email' | 'login-code' | 'register' | 'register-email' | 'register-code' | 'forgot' | 'reset-code';\n\ninterface PopupBanner {\n  id?: string;\n  url?: string | null;\n  type?: 'image' | 'video' | null;\n  fileName?: string | null;\n  title?: string | null;\n  description?: string | null;\n  durationSeconds?: number | null;\n  tags?: Array<{ icon?: string; text?: string }>;\n}\n\ninterface PopupConfig {\n  banners?: PopupBanner[];\n  bannerUrl?: string | null;\n  bannerType?: 'image' | 'video' | null;\n  fileName?: string | null;\n  title?: string | null;\n  description?: string | null;\n  durationSeconds?: number | null;\n  tags?: Array<{ icon?: string; text?: string }>;\n}\n\nconst DEFAULT_BANNER_DURATION_SECONDS = 7;\nconst MIN_BANNER_DURATION_SECONDS = 1;\nconst MAX_BANNER_DURATION_SECONDS = 60;\nconst DEFAULT_BANNER_PATH = '/sdk/assets/crew-and-creative-agent-banner.jpg';\nconst DEFAULT_PRIVACY_URL = 'https://www.vidau.ai/vidau-privacy-policy/';\nconst DEFAULT_TERMS_URL = 'https://www.vidau.ai/vidau-terms-of-service/';\nconst RESEND_CODE_COOLDOWN_SECONDS = 60;\nconst TAG_ICON_SVGS: Record<string, string> = {\n  Sparkles: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\"></path><path d=\"M20 2v4\"></path><path d=\"M22 4h-4\"></path><circle cx=\"4\" cy=\"20\" r=\"2\"></circle></svg>',\n  Star: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\"></path></svg>',\n  Zap: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"></path></svg>',\n  Rocket: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\"></path><path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\"></path><path d=\"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\"></path><path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\"></path></svg>',\n  WandSparkles: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m21.64 3.64-1.28-1.28a1.21 1.21 0 0 0-1.72 0L2.36 18.64a1.21 1.21 0 0 0 0 1.72l1.28 1.28a1.2 1.2 0 0 0 1.72 0L21.64 5.36a1.2 1.2 0 0 0 0-1.72\"></path><path d=\"m14 7 3 3\"></path><path d=\"M5 6v4\"></path><path d=\"M19 14v4\"></path><path d=\"M10 2v2\"></path><path d=\"M7 8H3\"></path><path d=\"M21 16h-4\"></path><path d=\"M11 3H9\"></path></svg>',\n  Video: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\"></path><rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\"></rect></svg>',\n  Film: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"></rect><path d=\"M7 3v18\"></path><path d=\"M3 7.5h4\"></path><path d=\"M3 12h18\"></path><path d=\"M3 16.5h4\"></path><path d=\"M17 3v18\"></path><path d=\"M17 7.5h4\"></path><path d=\"M17 16.5h4\"></path></svg>',\n  Clapperboard: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m12.296 3.464 3.02 3.956\"></path><path d=\"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3z\"></path><path d=\"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"></path><path d=\"m6.18 5.276 3.1 3.899\"></path></svg>',\n  Camera: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\"></path><circle cx=\"12\" cy=\"13\" r=\"3\"></circle></svg>',\n  Image: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"></rect><circle cx=\"9\" cy=\"9\" r=\"2\"></circle><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"></path></svg>',\n  MonitorPlay: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M15.033 9.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56V7.648a.645.645 0 0 1 .967-.56z\"></path><path d=\"M12 17v4\"></path><path d=\"M8 21h8\"></path><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\"></rect></svg>',\n  Play: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"></path></svg>',\n  Gem: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M10.5 3 8 9l4 13 4-13-2.5-6\"></path><path d=\"M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z\"></path><path d=\"M2 9h20\"></path></svg>',\n  Crown: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\"></path><path d=\"M5 21h14\"></path></svg>',\n  Flame: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 3q1 4 4 6.5t3 5.5a1 1 0 0 1-14 0 5 5 0 0 1 1-3 1 1 0 0 0 5 0c0-2-1.5-3-1.5-5q0-2 2.5-4\"></path></svg>',\n  Globe2: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21.54 15H17a2 2 0 0 0-2 2v4.54\"></path><path d=\"M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17\"></path><path d=\"M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05\"></path><circle cx=\"12\" cy=\"12\" r=\"10\"></circle></svg>',\n  Bot: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 8V4H8\"></path><rect width=\"16\" height=\"12\" x=\"4\" y=\"8\" rx=\"2\"></rect><path d=\"M2 14h2\"></path><path d=\"M20 14h2\"></path><path d=\"M15 13v2\"></path><path d=\"M9 13v2\"></path></svg>',\n  Gift: '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 7v14\"></path><path d=\"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8\"></path><path d=\"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5\"></path><rect x=\"3\" y=\"7\" width=\"18\" height=\"4\" rx=\"1\"></rect></svg>',\n};\n\nexport class VidauAuthDialog extends HTMLElement {\n  private shadow: ShadowRoot;\n  private isOpen: boolean = false;\n  private mode: AuthView = 'login';\n  private loading: boolean = false;\n  private resending: boolean = false;\n  private resendCooldownSeconds: number = 0;\n  private resendCooldownTimer: number | null = null;\n  private errorMsg: string = '';\n  private successMsg: string = '';\n  private email: string = '';\n  private password: string = '';\n  private verificationCode: string = '';\n  private popupConfig: PopupConfig | null = null;\n  private providers = new Set(['google', 'apple', 'microsoft', 'facebook', 'email']);\n  private registrationEnabled = true;\n  private privacyUrl = DEFAULT_PRIVACY_URL;\n  private termsUrl = DEFAULT_TERMS_URL;\n  private activeBannerIndex = 0;\n  private bannerTimer: number | null = null;\n  private bannerIdleHandle: number | null = null;\n  private googleButtonTimer: number | null = null;\n  private googleAnalyticsUnbind: (() => void) | null = null;\n  private pageOverflow: { html: string; body: string } | null = null;\n\n  constructor() {\n    super();\n    this.shadow = this.attachShadow({ mode: 'open' });\n  }\n\n  connectedCallback() {\n    if (!getUserConfig()) {\n      const env = this.getAttribute('env') === 'development' || window.location.hostname.includes('vidau.info')\n        ? 'development'\n        : 'production';\n      initConfig(env);\n      setUserConfig({\n        appId: this.getAttribute('app-id') || '',\n        env,\n        locale: this.getAttribute('locale') || 'en-US',\n        redirectUrl: this.getAttribute('redirect-url') || window.location.href,\n      });\n    }\n    this.render();\n    initAnalytics();\n    this.initThirdPartySDKs();\n    this.fetchPopupConfig();\n  }\n\n  disconnectedCallback() {\n    this.stopBannerWork();\n    this.stopGoogleButtonWork();\n    this.clearResendCooldown();\n    this.unlockPageScroll();\n  }\n\n  private getPopupConfigEndpoint(): string {\n    return getConfig().apiBaseUrl.replace('/api/sso/', '/api/sso/popup-config');\n  }\n\n  private getDefaultBanner(): PopupBanner {\n    let url = DEFAULT_BANNER_PATH;\n    try {\n      url = new URL(DEFAULT_BANNER_PATH, this.getPopupConfigEndpoint()).href;\n    } catch {\n      // Keep the relative fallback for unusual custom API configurations.\n    }\n    return {\n      id: 'default',\n      url,\n      type: 'image',\n      fileName: 'Crew-and-creative-agent-banner-dh.jpg',\n      durationSeconds: DEFAULT_BANNER_DURATION_SECONDS,\n      tags: [],\n    };\n  }\n\n  private getBannerDurationSeconds(banner?: PopupBanner): number {\n    const seconds = banner?.durationSeconds;\n    return typeof seconds === 'number'\n      && Number.isInteger(seconds)\n      && seconds >= MIN_BANNER_DURATION_SECONDS\n      && seconds <= MAX_BANNER_DURATION_SECONDS\n      ? seconds\n      : DEFAULT_BANNER_DURATION_SECONDS;\n  }\n\n  private getBannerDurationMs(banner?: PopupBanner): number {\n    return this.getBannerDurationSeconds(banner) * 1000;\n  }\n\n  private getBanners(): PopupBanner[] {\n    if (!this.popupConfig) return [];\n\n    const configured = Array.isArray(this.popupConfig.banners) && this.popupConfig.banners.length\n      ? this.popupConfig.banners\n      : this.popupConfig.bannerUrl\n        ? [{\n          id: 'legacy-banner',\n          url: this.popupConfig.bannerUrl,\n          type: this.popupConfig.bannerType,\n          fileName: this.popupConfig.fileName,\n          title: this.popupConfig.title,\n          description: this.popupConfig.description,\n          durationSeconds: this.popupConfig.durationSeconds,\n          tags: this.popupConfig.tags,\n        }]\n        : [];\n\n    const banners = configured.slice(0, 10).flatMap((banner, index) => {\n      const url = safeUrl(banner?.url);\n      if (!url) return [];\n      return [{\n        id: String(banner.id || `banner-${index + 1}`),\n        url,\n        type: banner.type === 'video' ? 'video' as const : 'image' as const,\n        fileName: String(banner.fileName || ''),\n        title: String(banner.title || ''),\n        description: String(banner.description || ''),\n        durationSeconds: this.getBannerDurationSeconds(banner),\n        tags: Array.isArray(banner.tags) ? banner.tags.slice(0, 10) : [],\n      }];\n    });\n\n    return banners.length ? banners : [this.getDefaultBanner()];\n  }\n\n  private async fetchPopupConfig() {\n    try {\n      const res = await fetch(this.getPopupConfigEndpoint());\n      if (!res.ok) throw new Error(`Popup config request failed (${res.status})`);\n      this.popupConfig = await res.json() as PopupConfig;\n    } catch (error) {\n      console.warn('Failed to fetch popup config', error);\n      this.popupConfig = { banners: [this.getDefaultBanner()] };\n    } finally {\n      if (this.isOpen) {\n        this.activeBannerIndex = 0;\n        this.render();\n      }\n    }\n  }\n\n  private initThirdPartySDKs() {\n    const config = getConfig();\n\n    // Google\n    if (!document.getElementById('google-gsi')) {\n      const script = document.createElement('script');\n      script.id = 'google-gsi';\n      script.src = 'https://accounts.google.com/gsi/client?hl=en';\n      script.async = true;\n      document.head.appendChild(script);\n    }\n    // Facebook\n    if (!document.getElementById('facebook-jssdk')) {\n      const script = document.createElement('script');\n      script.id = 'facebook-jssdk';\n      script.src = 'https://connect.facebook.net/en_US/sdk.js';\n      script.async = true;\n      (window as any).fbAsyncInit = function () {\n        (window as any).FB?.init({\n          appId: config.facebookAppId,\n          cookie: true,\n          xfbml: false,\n          version: 'v17.0',\n        });\n      };\n      document.head.appendChild(script);\n    }\n    // Apple\n    if (!document.getElementById('apple-auth')) {\n      const script = document.createElement('script');\n      script.id = 'apple-auth';\n      script.src = 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js';\n      script.async = true;\n      document.head.appendChild(script);\n    }\n    // Microsoft\n    if (!document.getElementById('msal-browser')) {\n      const script = document.createElement('script');\n      script.id = 'msal-browser';\n      script.src = 'https://alcdn.msauth.net/browser/2.37.1/js/msal-browser.min.js';\n      script.async = true;\n      document.head.appendChild(script);\n    }\n  }\n\n  public open(mode: 'login' | 'register' = 'login') {\n    this.clearResendCooldown();\n    this.mode = mode === 'register' && !this.registrationEnabled ? 'login' : mode;\n    this.verificationCode = '';\n    this.isOpen = true;\n    this.errorMsg = '';\n    this.successMsg = '';\n    this.lockPageScroll();\n    this.render();\n    eventBus.emit('modal_open');\n    trackSignupModalView(this.mode === 'register' ? 'register' : 'login');\n  }\n\n  public close() {\n    this.isOpen = false;\n    this.stopBannerWork();\n    this.stopGoogleButtonWork();\n    this.clearResendCooldown();\n    this.unlockPageScroll();\n    this.render();\n    eventBus.emit('modal_close');\n  }\n\n  public configure(options: { providers?: string[]; registrationEnabled?: boolean; privacyUrl?: string; termsUrl?: string }) {\n    if (options.providers) this.providers = new Set(options.providers);\n    if (options.registrationEnabled !== undefined) this.registrationEnabled = options.registrationEnabled;\n    this.privacyUrl = safeUrl(options.privacyUrl, false) || DEFAULT_PRIVACY_URL;\n    this.termsUrl = safeUrl(options.termsUrl, false) || DEFAULT_TERMS_URL;\n  }\n\n  private lockPageScroll() {\n    if (!window.matchMedia('(max-width: 767px)').matches || this.pageOverflow) return;\n    this.pageOverflow = {\n      html: document.documentElement.style.overflow,\n      body: document.body.style.overflow,\n    };\n    document.documentElement.style.overflow = 'hidden';\n    document.body.style.overflow = 'hidden';\n  }\n\n  private unlockPageScroll() {\n    if (!this.pageOverflow) return;\n    document.documentElement.style.overflow = this.pageOverflow.html;\n    document.body.style.overflow = this.pageOverflow.body;\n    this.pageOverflow = null;\n  }\n\n  private stopBannerWork() {\n    if (this.bannerTimer !== null) {\n      window.clearTimeout(this.bannerTimer);\n      this.bannerTimer = null;\n    }\n    if (this.bannerIdleHandle !== null) {\n      const idleWindow = window as Window & { cancelIdleCallback?: (handle: number) => void };\n      if (idleWindow.cancelIdleCallback) idleWindow.cancelIdleCallback(this.bannerIdleHandle);\n      else window.clearTimeout(this.bannerIdleHandle);\n      this.bannerIdleHandle = null;\n    }\n    const video = this.shadow.querySelector<HTMLVideoElement>('video.banner-media');\n    video?.pause();\n  }\n\n  private stopGoogleButtonWork() {\n    if (this.googleButtonTimer !== null) {\n      window.clearTimeout(this.googleButtonTimer);\n      this.googleButtonTimer = null;\n    }\n    this.googleAnalyticsUnbind?.();\n    this.googleAnalyticsUnbind = null;\n  }\n\n  private updateResendCooldownButton() {\n    const button = this.shadow.querySelector<HTMLButtonElement>('#resend-code-btn');\n    if (!button) return;\n    button.disabled = this.resending || this.resendCooldownSeconds > 0;\n    button.textContent = this.resending\n      ? 'Resending...'\n      : this.resendCooldownSeconds > 0\n        ? `Resend code in ${this.resendCooldownSeconds}s`\n        : 'Resend code';\n  }\n\n  private clearResendCooldown() {\n    if (this.resendCooldownTimer !== null) {\n      window.clearInterval(this.resendCooldownTimer);\n      this.resendCooldownTimer = null;\n    }\n    this.resendCooldownSeconds = 0;\n    this.updateResendCooldownButton();\n  }\n\n  private startResendCooldown() {\n    this.clearResendCooldown();\n    this.resendCooldownSeconds = RESEND_CODE_COOLDOWN_SECONDS;\n    this.updateResendCooldownButton();\n    this.resendCooldownTimer = window.setInterval(() => {\n      this.resendCooldownSeconds -= 1;\n      if (this.resendCooldownSeconds <= 0) {\n        this.clearResendCooldown();\n        return;\n      }\n      this.updateResendCooldownButton();\n    }, 1000);\n  }\n\n  private scheduleBannerMount() {\n    this.stopBannerWork();\n    if (!this.isOpen || window.matchMedia('(max-width: 767px)').matches || !this.getBanners().length) return;\n\n    const mount = () => {\n      this.bannerIdleHandle = null;\n      this.mountActiveBanner();\n      this.scheduleNextBanner();\n    };\n    const idleWindow = window as Window & {\n      requestIdleCallback?: (callback: () => void, options?: { timeout: number }) => number;\n    };\n    this.bannerIdleHandle = idleWindow.requestIdleCallback\n      ? idleWindow.requestIdleCallback(mount, { timeout: 600 })\n      : window.setTimeout(mount, 80);\n  }\n\n  private scheduleNextBanner() {\n    if (this.bannerTimer !== null) window.clearTimeout(this.bannerTimer);\n    const banners = this.getBanners();\n    if (!this.isOpen || banners.length < 2) return;\n    const durationMs = this.getBannerDurationMs(banners[this.activeBannerIndex] || banners[0]);\n\n    this.bannerTimer = window.setTimeout(() => {\n      if (document.hidden) {\n        this.scheduleNextBanner();\n        return;\n      }\n      this.activateBanner((this.activeBannerIndex + 1) % banners.length);\n    }, durationMs);\n  }\n\n  private mountActiveBanner() {\n    const banners = this.getBanners();\n    const banner = banners[this.activeBannerIndex];\n    const slot = this.shadow.querySelector<HTMLElement>('#banner-media-slot');\n    if (!slot || !banner) return;\n\n    slot.replaceChildren();\n    slot.classList.remove('loaded', 'media-error');\n    const url = safeUrl(banner.url);\n    if (!url) {\n      slot.classList.add('media-error');\n      return;\n    }\n\n    const fallbackUrl = safeUrl(this.getDefaultBanner().url);\n\n    if (banner.type === 'video') {\n      const video = document.createElement('video');\n      video.className = 'banner-media';\n      video.muted = true;\n      video.loop = true;\n      video.playsInline = true;\n      video.autoplay = true;\n      video.preload = 'none';\n      video.setAttribute('aria-hidden', 'true');\n      video.addEventListener('loadeddata', () => slot.classList.add('loaded'), { once: true });\n      video.addEventListener('error', () => slot.classList.add('media-error'), { once: true });\n      slot.appendChild(video);\n      video.src = url;\n      video.load();\n      void video.play().catch(() => undefined);\n      return;\n    }\n\n    const image = document.createElement('img');\n    image.className = 'banner-media';\n    image.alt = banner.title ? String(banner.title) : '';\n    // The banner is visible as soon as the dialog opens, so lazy/low-priority\n    // loading can leave the panel blank on slower connections.\n    image.loading = 'eager';\n    image.decoding = 'async';\n    image.fetchPriority = 'high';\n    image.addEventListener('load', () => slot.classList.add('loaded'), { once: true });\n    image.addEventListener('error', () => {\n      // A bad CMS/CDN asset should not leave an otherwise usable dialog black.\n      if (fallbackUrl && image.src !== fallbackUrl) {\n        image.src = fallbackUrl;\n        return;\n      }\n      slot.classList.add('media-error');\n    });\n    slot.appendChild(image);\n    image.src = url;\n  }\n\n  private renderTagIcon(iconName?: string): string {\n    return TAG_ICON_SVGS[String(iconName || '').trim()] || TAG_ICON_SVGS.Sparkles;\n  }\n\n  private createTagIcon(iconName?: string): Element {\n    const template = document.createElement('template');\n    template.innerHTML = this.renderTagIcon(iconName);\n    return template.content.firstElementChild || document.createElement('span');\n  }\n\n  private activateBanner(index: number) {\n    const banners = this.getBanners();\n    if (!banners.length) return;\n    this.activeBannerIndex = (index + banners.length) % banners.length;\n    const banner = banners[this.activeBannerIndex];\n\n    const title = this.shadow.querySelector<HTMLElement>('#banner-title');\n    const description = this.shadow.querySelector<HTMLElement>('#banner-description');\n    const tags = this.shadow.querySelector<HTMLElement>('#banner-tags');\n    this.shadow.querySelector<HTMLElement>('.banner-section')\n      ?.style.setProperty('--banner-duration', `${this.getBannerDurationMs(banner)}ms`);\n    if (title) {\n      title.textContent = String(banner.title || '');\n      title.hidden = !banner.title;\n    }\n    if (description) {\n      description.textContent = String(banner.description || '');\n      description.hidden = !banner.description;\n    }\n    if (tags) {\n      tags.replaceChildren(...(banner.tags || []).map((tag) => {\n        const item = document.createElement('span');\n        item.className = 'banner-tag';\n        const icon = document.createElement('span');\n        icon.className = 'banner-tag-icon';\n        icon.append(this.createTagIcon(tag.icon));\n        const text = document.createElement('span');\n        text.textContent = String(tag.text || '');\n        item.append(icon, text);\n        return item;\n      }));\n      tags.hidden = !(banner.tags || []).some((tag) => tag.text);\n    }\n\n    this.shadow.querySelectorAll<HTMLElement>('.banner-step').forEach((step, stepIndex) => {\n      step.classList.toggle('active', stepIndex === this.activeBannerIndex);\n    });\n    this.mountActiveBanner();\n    this.scheduleNextBanner();\n  }\n\n  private renderLogo(): string {\n    return `<div class=\"vidau-logo\" aria-hidden=\"true\">\n      <svg viewBox=\"0 0 400 400\" role=\"img\">\n        <defs><linearGradient id=\"vidau-logo-gradient\" x1=\"1\" y1=\".5\" x2=\"0\" y2=\".5\"><stop offset=\"0\" stop-color=\"#6a3bff\"/><stop offset=\"1\" stop-color=\"#3459ff\"/></linearGradient></defs>\n        <rect width=\"400\" height=\"400\" rx=\"48\" fill=\"url(#vidau-logo-gradient)\"/>\n        <path transform=\"matrix(1 0 -.1405 .9901 9.1 .64)\" d=\"M114.1 64.76c-2.67 0-4.68 2.43-4.19 5.06l48.86 265.4a4.26 4.26 0 0 0 4.19 3.5h81.71a4.26 4.26 0 0 0 4.2-3.5l48.86-265.4c.48-2.63-1.53-5.06-4.19-5.06h-57.7a4.26 4.26 0 0 0-4.21 3.65l-27.81 196.15-27.81-196.15a4.26 4.26 0 0 0-4.22-3.65z\" fill=\"#fff\"/>\n      </svg>\n    </div>`;\n  }\n\n  private renderProviderIcon(provider: string): string {\n    const icons: Record<string, string> = {\n      google: `<svg viewBox=\"0 0 120 120\" aria-hidden=\"true\"><path fill=\"#4285F4\" d=\"M117.6 61.36c0-4.25-.38-8.34-1.09-12.27H60V72.3h32.29c-1.39 7.5-5.62 13.85-11.97 18.11v15.05H99.7c11.35-10.44 17.9-25.82 17.9-44.1Z\"/><path fill=\"#34A853\" d=\"M60 120c16.2 0 29.78-5.37 39.71-14.54L80.32 90.41c-5.37 3.6-12.25 5.73-20.32 5.73-15.63 0-28.85-10.56-33.57-24.74L6.38 86.95C16.25 106.55 36.55 120 60 120Z\"/><path fill=\"#FBBC05\" d=\"M26.43 71.4A35.96 35.96 0 0 1 24.55 60c0-3.95.68-7.8 1.88-11.4V33.05H6.38A59.97 59.97 0 0 0 0 60c0 9.68 2.32 18.85 6.38 26.95L26.43 71.4Z\"/><path fill=\"#EA4335\" d=\"M60 23.86c8.81 0 16.72 3.03 22.94 8.98l17.2-17.21C89.76 5.95 76.17 0 60 0 36.55 0 16.25 13.45 6.38 33.05L26.43 48.6C31.15 34.42 44.37 23.86 60 23.86Z\"/></svg>`,\n      apple: `<span class=\"provider-disc\"><svg viewBox=\"6 6 44 44\" aria-hidden=\"true\"><path fill=\"#fff\" d=\"M28.22 20.38c.83 0 1.88-.58 2.5-1.35.56-.7.97-1.68.97-2.66 0-.13-.01-.26-.03-.37-.93.04-2.04.64-2.71 1.45-.53.62-1.01 1.58-1.01 2.57 0 .15.02.29.04.34.06.01.15.02.24.02ZM25.29 35c1.14 0 1.64-.79 3.06-.79 1.44 0 1.76.77 3.03.77 1.24 0 2.07-1.19 2.86-2.35.88-1.33 1.24-2.63 1.26-2.69-.08-.03-2.46-1.03-2.46-3.84 0-2.44 1.87-3.54 1.98-3.63-1.24-1.83-3.13-1.88-3.64-1.88-1.4 0-2.54.87-3.25.87-.77 0-1.79-.82-3-.82-2.3 0-4.63 1.96-4.63 5.65 0 2.3.87 4.73 1.93 6.3C23.35 33.91 24.14 35 25.29 35Z\"/></svg></span>`,\n      microsoft: `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#f35325\" d=\"M1 1h10.5v10.5H1z\"/><path fill=\"#81bc06\" d=\"M12.5 1H23v10.5H12.5z\"/><path fill=\"#05a6f0\" d=\"M1 12.5h10.5V23H1z\"/><path fill=\"#ffba08\" d=\"M12.5 12.5H23V23H12.5z\"/></svg>`,\n      facebook: `<span class=\"facebook-disc\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#1877F2\" d=\"M24 12A12 12 0 1 0 10.12 23.85v-8.38H7.08V12h3.04V9.36c0-3.01 1.8-4.67 4.54-4.67 1.31 0 2.68.23 2.68.23v2.95h-1.51c-1.49 0-1.96.93-1.96 1.88V12h3.33l-.53 3.47h-2.8v8.38A12 12 0 0 0 24 12z\"/><path fill=\"#fff\" d=\"m16.67 15.47.53-3.47h-3.33V9.75c0-.95.47-1.88 1.96-1.88h1.51V4.92s-1.37-.23-2.68-.23c-2.74 0-4.54 1.66-4.54 4.67V12H7.08v3.47h3.04v8.38a12.1 12.1 0 0 0 3.75 0v-8.38z\"/></svg></span>`,\n    };\n    return icons[provider] || '';\n  }\n\n  private renderAuthForm(): string {\n    const email = escapeHtml(this.email);\n    const isVerificationView = this.mode === 'register-code' || this.mode === 'reset-code' || this.mode === 'login-code';\n    const disabled = this.loading || this.resending || isVerificationView ? 'disabled' : '';\n    const submitLabel = this.loading ? 'Processing...' : {\n      login: '',\n      'login-email': 'Sign In',\n      'login-code': 'Verify',\n      register: '',\n      'register-email': 'Continue with Email',\n      'register-code': 'Verify',\n      forgot: 'Send reset code',\n      'reset-code': 'Reset password',\n    }[this.mode];\n\n    const emailField = `\n      <div class=\"input-control\">\n        <input type=\"email\" id=\"email\" class=\"input-field\" value=\"${email}\" placeholder=\"${this.mode === 'register-email' ? 'yourname@email.com' : 'Enter your email'}\" aria-label=\"Email address\" autocomplete=\"email\" required />\n      </div>`;\n    const passwordField = `\n      <div class=\"input-control password-control\">\n        <input type=\"password\" id=\"password\" class=\"input-field\" placeholder=\"${this.mode === 'reset-code' ? 'Enter a new password' : 'Enter your password'}\" aria-label=\"${this.mode === 'reset-code' ? 'New password' : 'Password'}\" autocomplete=\"${this.mode === 'login-email' ? 'current-password' : 'new-password'}\" ${this.mode === 'login-email' ? '' : 'minlength=\"8\"'} required />\n        <button type=\"button\" class=\"password-toggle\" id=\"password-toggle\" aria-label=\"Show password\">\n          <svg class=\"password-eye password-eye-hidden\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m3 3 18 18\"/><path d=\"M10.6 10.6a2 2 0 0 0 2.8 2.8\"/><path d=\"M9.9 4.2A10.8 10.8 0 0 1 12 4c6.1 0 9.6 8 9.6 8a16.9 16.9 0 0 1-2.3 3.4\"/><path d=\"M6.6 6.6A17.3 17.3 0 0 0 2.4 12s3.5 8 9.6 8a9.7 9.7 0 0 0 4.1-.9\"/></svg>\n          <svg class=\"password-eye password-eye-visible\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" hidden><path d=\"M2.4 12s3.5-5 9.6-5 9.6 5 9.6 5-3.5 5-9.6 5-9.6-5-9.6-5Z\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\"/></svg>\n        </button>\n      </div>`;\n    const verificationCodeFields = Array.from({ length: 6 }, (_, index) => `\n      <input\n        type=\"text\"\n        class=\"verification-input\"\n        data-code-index=\"${index}\"\n        inputmode=\"numeric\"\n        autocomplete=\"${index === 0 ? 'one-time-code' : 'off'}\"\n        maxlength=\"1\"\n        pattern=\"[0-9]\"\n        value=\"${escapeHtml(this.verificationCode[index] || '')}\"\n        placeholder=\"0\"\n        aria-label=\"Verification code digit ${index + 1}\"\n        required\n      />`).join('');\n    const resendButtonLabel = this.resending\n      ? 'Resending...'\n      : this.resendCooldownSeconds > 0\n        ? `Resend code in ${this.resendCooldownSeconds}s`\n        : 'Resend code';\n    const resendButton = this.mode === 'register-code' || this.mode === 'reset-code' || this.mode === 'login-code'\n      ? `<button type=\"button\" class=\"resend-code-btn\" id=\"resend-code-btn\" aria-live=\"polite\" ${this.resending || this.resendCooldownSeconds > 0 ? 'disabled' : ''}>${resendButtonLabel}</button>`\n      : '';\n\n    let fields = '';\n    if (this.mode === 'login-email') {\n      fields = `${emailField}<div class=\"login-password-group\">${passwordField}<button type=\"button\" class=\"text-btn forgot-btn\" id=\"forgot-btn\">Forgot password?</button></div>`;\n    } else if (this.mode === 'register-email') {\n      fields = `<div class=\"register-fields\">\n        ${emailField}\n        <div class=\"register-password-group\">\n          ${passwordField}\n          <div class=\"password-checks\" aria-live=\"polite\">\n            <div class=\"password-check\" data-password-rule=\"length\">\n              <span class=\"password-check-icon\" aria-hidden=\"true\">✓</span>\n              <span>Must be at least 8 characters</span>\n            </div>\n            <div class=\"password-check\" data-password-rule=\"special\">\n              <span class=\"password-check-icon\" aria-hidden=\"true\">✓</span>\n              <span>Must contain one special character</span>\n            </div>\n          </div>\n        </div>\n      </div>`;\n    } else if (this.mode === 'forgot') {\n      fields = `${emailField}`;\n    } else if (this.mode === 'register-code' || this.mode === 'login-code') {\n      fields = `<div class=\"verification-inputs\" role=\"group\" aria-label=\"6-digit verification code\">${verificationCodeFields}</div>${resendButton}`;\n    } else if (this.mode === 'reset-code') {\n      fields = `<div class=\"verification-inputs\" role=\"group\" aria-label=\"6-digit verification code\">${verificationCodeFields}</div>${resendButton}${passwordField}\n        <button type=\"button\" class=\"text-btn edit-email-btn\" id=\"back-edit-btn\">Use another email</button>`;\n    } else {\n      fields = `${passwordField}\n        <button type=\"button\" class=\"text-btn edit-email-btn\" id=\"back-edit-btn\">Use another email</button>`;\n    }\n\n    const formClass = this.mode === 'register-email'\n      ? 'register-form'\n      : isVerificationView\n        ? 'verification-form'\n        : '';\n    return `<form id=\"auth-form\" class=\"${formClass}\">${fields}<button type=\"submit\" class=\"submit-btn\" ${disabled}>${submitLabel}</button></form>`;\n  }\n\n  private renderBannerMarkup(): string {\n    const banners = this.getBanners();\n    const banner = banners[this.activeBannerIndex] || banners[0];\n    const bannerDurationMs = this.getBannerDurationMs(banner);\n    const loading = this.popupConfig === null;\n    const tags = banner?.tags || [];\n\n    const steps = banners.map((item, index) => {\n      const fallbackLabel = String(item.fileName || '').replace(/\\.[^.]+$/, '') || `Banner ${index + 1}`;\n      const label = String(item.title || fallbackLabel);\n      return `<button type=\"button\" class=\"banner-step ${index === this.activeBannerIndex ? 'active' : ''}\" data-banner-index=\"${index}\" aria-label=\"Show ${escapeHtml(label)}\">\n        <span class=\"banner-step-track\"><span class=\"banner-step-progress\"></span></span>\n        <span class=\"banner-step-label\">${escapeHtml(label)}</span>\n      </button>`;\n    }).join('');\n\n    return `\n      <section class=\"banner-section ${loading ? 'skeleton' : ''}\" style=\"--banner-duration: ${bannerDurationMs}ms\" aria-label=\"VidAU highlights\" aria-busy=\"${loading}\">\n        <div class=\"banner-media-slot\" id=\"banner-media-slot\"></div>\n        <div class=\"banner-gradient\"></div>\n          <div class=\"banner-content\">\n          <div class=\"banner-tags\" id=\"banner-tags\" ${tags.some((tag) => tag.text) ? '' : 'hidden'}>\n            ${tags.map((tag) => `<span class=\"banner-tag\"><span class=\"banner-tag-icon\">${this.renderTagIcon(tag.icon)}</span><span>${escapeHtml(tag.text)}</span></span>`).join('')}\n          </div>\n          <h2 class=\"banner-title\" id=\"banner-title\" ${banner?.title ? '' : 'hidden'}>${escapeHtml(banner?.title)}</h2>\n          <p class=\"banner-description\" id=\"banner-description\" ${banner?.description ? '' : 'hidden'}>${escapeHtml(banner?.description)}</p>\n          <div class=\"banner-steps\" ${banners.length ? '' : 'hidden'}>${steps}</div>\n        </div>\n      </section>`;\n  }\n\n  private renderSocialButtons(): string {\n    const providers = ['google', 'apple', 'microsoft', 'facebook']\n      .filter((provider) => this.providers.has(provider));\n    const labels: Record<string, string> = {\n      google: 'Continue with Google',\n      apple: 'Continue with Apple',\n      microsoft: 'Continue with Microsoft',\n      facebook: 'Continue with Facebook',\n    };\n\n    return providers.map((provider) => provider === 'google'\n      ? `<div class=\"google-provider\">\n          <div class=\"google-button-host\" id=\"google-button-host\"></div>\n          <button class=\"provider-btn google-fallback\" id=\"btn-google\" type=\"button\">\n            ${this.renderProviderIcon(provider)}<span>${labels[provider]}</span>\n          </button>\n        </div>`\n      : `<button class=\"provider-btn\" id=\"btn-${provider}\" type=\"button\">\n          ${this.renderProviderIcon(provider)}<span>${labels[provider]}</span>\n        </button>`\n    ).join('');\n  }\n\n  private renderSocialIconButtons(): string {\n    return ['google', 'apple', 'microsoft', 'facebook']\n      .filter((provider) => this.providers.has(provider))\n      .map((provider) => `<button class=\"social-icon-btn\" id=\"btn-${provider}\" type=\"button\" aria-label=\"Continue with ${provider}\">\n        ${this.renderProviderIcon(provider)}\n      </button>`)\n      .join('');\n  }\n\n  private mountGoogleButton(attempt = 0) {\n    this.googleButtonTimer = null;\n    if (!this.isOpen || !this.providers.has('google') || (this.mode !== 'login' && this.mode !== 'register')) return;\n\n    const host = this.shadow.querySelector<HTMLElement>('#google-button-host');\n    const google = (window as any).google;\n    if (!host) return;\n    if (!google?.accounts?.id) {\n      if (attempt < 40) {\n        this.googleButtonTimer = window.setTimeout(() => this.mountGoogleButton(attempt + 1), 100);\n      }\n      return;\n    }\n\n    google.accounts.id.initialize({\n      client_id: getConfig().googleClientId,\n      callback: (response: { credential?: string }) => {\n        if (response.credential) void this.handleGoogleCredential(response.credential);\n      },\n      auto_select: false,\n      use_fedcm_for_button: true,\n    });\n    host.replaceChildren();\n    google.accounts.id.renderButton(host, {\n      type: 'standard',\n      theme: 'filled_black',\n      size: 'large',\n      text: 'continue_with',\n      shape: 'pill',\n      logo_alignment: 'left',\n      width: '289px',\n      locale: 'en',\n    });\n    host.parentElement?.classList.add('is-ready');\n    this.bindGoogleSignupMethodCapture(host);\n  }\n\n  private bindGoogleSignupMethodCapture(host: HTMLElement) {\n    this.googleAnalyticsUnbind?.();\n    const fire = () => trackSignupMethodClick('google');\n    const onWindowBlur = () => {\n      window.setTimeout(() => {\n        if (!this.isOpen) return;\n        const active = this.shadow.activeElement;\n        if (active && host.contains(active)) fire();\n        else if (document.activeElement === this) fire();\n      }, 0);\n    };\n    host.addEventListener('pointerdown', fire, true);\n    host.addEventListener('click', fire, true);\n    host.addEventListener('focusin', fire, true);\n    window.addEventListener('blur', onWindowBlur);\n    this.googleAnalyticsUnbind = () => {\n      host.removeEventListener('pointerdown', fire, true);\n      host.removeEventListener('click', fire, true);\n      host.removeEventListener('focusin', fire, true);\n      window.removeEventListener('blur', onWindowBlur);\n    };\n  }\n\n  private render() {\n    this.stopBannerWork();\n    this.stopGoogleButtonWork();\n    if (!this.isOpen) {\n      this.shadow.innerHTML = '';\n      return;\n    }\n\n    const isLogin = this.mode === 'login' || this.mode === 'login-email';\n    const isProviderChoice = this.mode === 'login' || this.mode === 'register';\n    const showProviderChoice = isProviderChoice && (\n      this.providers.has('email')\n      || ['google', 'apple', 'microsoft', 'facebook'].some((provider) => this.providers.has(provider))\n    );\n    const showLoginEmailProviders = this.mode === 'login-email'\n      && ['google', 'apple', 'microsoft', 'facebook'].some((provider) => this.providers.has(provider));\n    const showEmailForm = !isProviderChoice;\n    const copy: Record<AuthView, { title: string; description: string }> = {\n      login: {\n        title: 'Welcome back to VidAU AI',\n        description: '',\n      },\n      'login-email': {\n        title: 'Welcome back to VidAU AI',\n        description: 'Sign in to your account to continue where you left off.',\n      },\n      'login-code': {\n        title: 'Enter Verification Code',\n        description: \"Too many attempts. We've sent a 6-digit code to your email. Enter it to continue.\",\n      },\n      register: {\n        title: 'Create your VidAU AI account',\n        description: '',\n      },\n      'register-email': {\n        title: 'Create an Account',\n        description: '',\n      },\n      'register-code': {\n        title: 'Enter Verification Code',\n        description: \"We've sent a 6-digit code to your email. Enter it below to verify your account.\",\n      },\n      forgot: {\n        title: 'Reset your password',\n        description: 'Enter your email and we’ll send you a verification code.',\n      },\n      'reset-code': {\n        title: 'Create a new password',\n        description: 'Enter the code and choose a secure new password.',\n      },\n    };\n    const viewCopy = copy[this.mode];\n\n    const switchRow = isLogin\n      ? this.registrationEnabled\n        ? `<div class=\"account-row\"><span>Don’t have an account?</span><button type=\"button\" id=\"tab-register\">Sign up</button></div>`\n        : ''\n      : this.mode === 'register' || this.mode === 'register-email'\n        ? `<div class=\"account-row\"><span>Already have an account?</span><button type=\"button\" id=\"tab-login\">Log in</button></div>`\n        : this.mode === 'register-code' || this.mode === 'login-code'\n          ? ''\n          : `<div class=\"account-row\"><button type=\"button\" id=\"back-login-btn\">Back to sign in</button></div>`;\n\n    const privacyPolicy = this.privacyUrl\n      ? `<a href=\"${escapeHtml(this.privacyUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Policy</a>`\n      : '<span class=\"legal-link-label\">Privacy Policy</span>';\n    const termsOfUse = this.termsUrl\n      ? `<a href=\"${escapeHtml(this.termsUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">Terms of Use</a>`\n      : '<span class=\"legal-link-label\">Terms of Use</span>';\n    const legal = isLogin || this.mode === 'register' || this.mode === 'register-email'\n      ? `<div class=\"legal-links\">By continuing, I acknowledge the ${privacyPolicy} and agree to the ${termsOfUse}.<br />I also confirm that I am at least 18 years old</div>`\n      : '';\n    const signupOffer = this.mode === 'register'\n      ? `<div class=\"signup-offer\"><span aria-hidden=\"true\">${TAG_ICON_SVGS.Gift}</span><span>Sign up and get an additional discount</span></div>`\n      : '';\n\n    const html = `\n      <style>\n        :host {\n          position: fixed;\n          inset: 0;\n          z-index: 2147483647;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          box-sizing: border-box;\n          color: #fff;\n          font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n          -webkit-font-smoothing: antialiased;\n        }\n\n        *, *::before, *::after { box-sizing: border-box; }\n        button, input { font: inherit; }\n        button { -webkit-tap-highlight-color: transparent; }\n        [hidden], .hidden { display: none !important; }\n\n        .backdrop {\n          position: absolute;\n          inset: 0;\n          background: rgba(3, 5, 10, .76);\n          backdrop-filter: blur(8px);\n        }\n\n        .modal-card {\n          position: relative;\n          display: flex;\n          gap: clamp(24px, 4.54vh, 50px);\n          height: min(1101px, calc(100vh - 32px));\n          width: auto;\n          max-width: calc(100vw - 32px);\n          aspect-ratio: 1366 / 1101;\n          padding: clamp(18px, 2.72vh, 30px) clamp(12px, 1.82vh, 20px);\n          overflow: hidden;\n          border: 1px solid rgba(255, 255, 255, .04);\n          border-radius: clamp(18px, 2.18vh, 24px);\n          background: #0a0d12;\n          box-shadow: 0 32px 80px rgba(0, 0, 0, .52);\n          animation: modal-in .22s cubic-bezier(.16, 1, .3, 1);\n        }\n\n        @keyframes modal-in {\n          from { opacity: 0; transform: scale(.975) translateY(8px); }\n          to { opacity: 1; transform: scale(1) translateY(0); }\n        }\n\n        .banner-section {\n          position: relative;\n          display: flex;\n          flex: 1 1 0;\n          min-width: 0;\n          height: 100%;\n          overflow: hidden;\n          border-radius: clamp(12px, 1.45vh, 16px);\n          background: #11151d;\n          isolation: isolate;\n        }\n\n        .banner-media-slot {\n          position: absolute;\n          inset: 0;\n          overflow: hidden;\n          background: linear-gradient(135deg, #171c27, #10131a);\n        }\n\n        .banner-media-slot::after {\n          content: \"\";\n          position: absolute;\n          inset: 0;\n          z-index: 2;\n          opacity: 1;\n          background: linear-gradient(100deg, transparent 30%, rgba(255, 255, 255, .055) 50%, transparent 70%);\n          background-size: 240% 100%;\n          animation: shimmer 1.6s linear infinite;\n          transition: opacity .35s ease;\n          pointer-events: none;\n        }\n\n        .banner-media-slot.loaded::after { opacity: 0; }\n        .banner-media-slot.media-error::after { animation: none; opacity: .15; }\n        .banner-media-slot.media-error::before {\n          content: \"VidAU AI\";\n          position: absolute;\n          inset: 0;\n          z-index: 1;\n          display: grid;\n          place-items: center;\n          color: rgba(255, 255, 255, .78);\n          background: radial-gradient(circle at 20% 20%, rgba(106, 59, 255, .45), transparent 45%), linear-gradient(135deg, #171c27, #10131a);\n          font-size: clamp(24px, 3.27vh, 36px);\n          font-weight: 700;\n        }\n        @keyframes shimmer { to { background-position: -240% 0; } }\n\n        .banner-media {\n          width: 100%;\n          height: 100%;\n          object-fit: cover;\n          object-position: center;\n          opacity: 0;\n          transform: scale(1.015);\n          transition: opacity .45s ease, transform .8s ease;\n        }\n\n        .banner-media-slot.loaded .banner-media {\n          opacity: 1;\n          transform: scale(1);\n        }\n\n        .banner-gradient {\n          position: absolute;\n          inset: 0;\n          z-index: 1;\n          background: linear-gradient(180deg, rgba(0, 0, 0, 0) 45%, rgba(0, 0, 0, .9) 94%);\n          pointer-events: none;\n        }\n\n        .banner-content {\n          position: relative;\n          z-index: 2;\n          align-self: flex-end;\n          width: 100%;\n          padding: clamp(20px, 3.63vh, 40px) clamp(12px, 1.82vh, 20px);\n        }\n\n        .banner-tags {\n          display: flex;\n          flex-wrap: wrap;\n          gap: 5px;\n          margin-bottom: clamp(10px, 1.45vh, 20px);\n        }\n\n        .banner-tag {\n          display: inline-flex;\n          align-items: center;\n          gap: 5px;\n          min-height: clamp(20px, 2.54vh, 28px);\n          padding: clamp(2px, .45vh, 5px) 10px;\n          border-radius: 8px;\n          color: #fff;\n          background: rgba(37, 43, 55, .92);\n          font-size: clamp(8px, .9vh, 10px);\n          line-height: 18px;\n        }\n\n        .banner-tag-icon { display: inline-grid; width: 14px; height: 14px; flex: 0 0 14px; place-items: center; }\n        .banner-tag-icon svg { display: block; width: 14px; height: 14px; fill: none; stroke: currentColor; }\n        .banner-title {\n          margin: 0 0 5px;\n          font-size: clamp(24px, 3.27vh, 36px);\n          font-weight: 700;\n          line-height: 1.22;\n          letter-spacing: -.02em;\n          text-transform: uppercase;\n        }\n\n        .banner-description {\n          margin: 0;\n          color: #a4a7ae;\n          font-size: clamp(12px, 1.45vh, 16px);\n          line-height: 1.5;\n        }\n\n        .banner-steps {\n          display: flex;\n          gap: 10px;\n          width: 100%;\n          margin-top: clamp(20px, 3.6vh, 40px);\n        }\n\n        .banner-step {\n          flex: 1 1 0;\n          min-width: 0;\n          padding: 0;\n          overflow: hidden;\n          border: 0;\n          color: #414651;\n          background: transparent;\n          text-align: left;\n          cursor: pointer;\n        }\n\n        .banner-step-track {\n          position: relative;\n          display: block;\n          width: 100%;\n          height: clamp(6px, .73vh, 8px);\n          overflow: hidden;\n          border-radius: 999px;\n          background: #414651;\n        }\n\n        .banner-step-progress {\n          display: block;\n          width: 0;\n          height: 100%;\n          border-radius: inherit;\n          background: #fff;\n        }\n\n        .banner-step.active { color: #fff; }\n        .banner-step.active .banner-step-progress {\n          animation: banner-progress var(--banner-duration, ${DEFAULT_BANNER_DURATION_SECONDS * 1000}ms) linear forwards;\n        }\n        .banner-step-label {\n          display: block;\n          margin-top: 6px;\n          overflow: hidden;\n          font-size: clamp(10px, 1.45vh, 16px);\n          line-height: 1.5;\n          text-overflow: ellipsis;\n          white-space: nowrap;\n        }\n        @keyframes banner-progress { to { width: 100%; } }\n\n        .form-section {\n          position: relative;\n          display: flex;\n          flex: 1 1 0;\n          min-width: 0;\n          min-height: 0;\n          align-items: center;\n          justify-content: center;\n        }\n\n        .top-actions {\n          position: absolute;\n          top: 0;\n          left: 0;\n          right: 0;\n          z-index: 2147483647;\n          display: flex;\n          justify-content: space-between;\n        }\n\n        .round-action {\n          display: grid;\n          width: clamp(36px, 4.54vh, 50px);\n          height: clamp(36px, 4.54vh, 50px);\n          padding: 0;\n          place-items: center;\n          border: 0;\n          border-radius: 999px;\n          color: #f5f6f7;\n          background: rgba(24, 29, 39, .72);\n          cursor: pointer;\n          transition: background .18s ease, transform .18s ease;\n        }\n        .round-action:hover { background: #252b37; transform: translateY(-1px); }\n        .round-action svg { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }\n\n        .form-scroll {\n          width: 100%;\n          height: 100%;\n          max-height: 100%;\n          overflow: auto;\n          scrollbar-width: thin;\n          scrollbar-color: #252b37 transparent;\n        }\n\n        .form-content {\n          display: flex;\n          width: min(100%, 600px);\n          min-height: 100%;\n          margin: 0 auto;\n          padding: clamp(34px, 4.7vh, 52px);\n          flex-direction: column;\n          align-items: center;\n          justify-content: flex-start;\n        }\n\n        .brand-block {\n          display: flex;\n          flex-direction: column;\n          align-items: center;\n          gap: clamp(18px, 2.7vh, 30px);\n          margin-bottom: clamp(22px, 4.5vh, 50px);\n          text-align: center;\n        }\n\n        .vidau-logo { width: clamp(40px, 5.45vh, 60px); height: clamp(40px, 5.45vh, 60px); }\n        .vidau-logo svg { display: block; width: 100%; height: 100%; }\n        .auth-heading { margin: 0; font-size: clamp(24px, 3.27vh, 36px); font-weight: 600; line-height: 1.22; letter-spacing: -.02em; }\n        .auth-description { margin: 6px 0 0; color: #717680; font-size: clamp(12px, 1.64vh, 18px); line-height: 1.55; }\n        .auth-main { width: 100%; }\n\n        .signup-offer {\n          display: flex;\n          width: 100%;\n          min-height: clamp(42px, 5.45vh, 60px);\n          margin-bottom: clamp(14px, 1.82vh, 20px);\n          padding: 0 20px;\n          align-items: center;\n          justify-content: center;\n          gap: 10px;\n          border-radius: 8px;\n          color: #ff196a;\n          background: rgba(255, 25, 106, .08);\n          font-size: clamp(12px, 1.45vh, 16px);\n        }\n        .signup-offer svg { display: block; width: 18px; height: 18px; }\n\n        #auth-form {\n          --control-height: clamp(40px, 5.45vh, 60px);\n          --form-gap: clamp(18px, 2.72vh, 30px);\n          display: flex;\n          width: 100%;\n          flex-direction: column;\n          gap: var(--form-gap);\n        }\n        .input-control { position: relative; width: 100%; }\n        .input-field {\n          width: 100%;\n          height: var(--control-height);\n          padding: 0 14px;\n          border: 1px solid #535862;\n          border-radius: 8px;\n          outline: none;\n          color: #fff;\n          background: #181d27;\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .08);\n          font-family: inherit;\n          font-size: clamp(12px, 1.64vh, 18px);\n          font-weight: 400;\n          transition: border-color .18s ease, box-shadow .18s ease;\n        }\n        .input-field::placeholder { color: #717680; opacity: 1; }\n        .input-field:valid { border-color: #5573ff; }\n        .input-field:focus { border-color: #5573ff; box-shadow: 0 0 0 3px rgba(52, 89, 255, .16); }\n        .input-field:-webkit-autofill,\n        .input-field:-webkit-autofill:hover,\n        .input-field:-webkit-autofill:active {\n          border-color: #5573ff;\n          -webkit-text-fill-color: #fff;\n          caret-color: #fff;\n          -webkit-box-shadow: 0 0 0 1000px #181d27 inset;\n          box-shadow: 0 0 0 1000px #181d27 inset;\n        }\n        .input-field:-webkit-autofill:focus {\n          border-color: #5573ff;\n          -webkit-text-fill-color: #fff;\n          -webkit-box-shadow: 0 0 0 1000px #181d27 inset, 0 0 0 3px rgba(52, 89, 255, .16);\n          box-shadow: 0 0 0 1000px #181d27 inset, 0 0 0 3px rgba(52, 89, 255, .16);\n        }\n        .password-control .input-field { padding-right: 48px; }\n        .password-toggle {\n          position: absolute;\n          top: 50%;\n          right: 14px;\n          display: grid;\n          width: 28px;\n          height: 28px;\n          padding: 0;\n          place-items: center;\n          border: 0;\n          color: #535862;\n          background: transparent;\n          transform: translateY(-50%);\n          cursor: pointer;\n        }\n        .password-toggle svg { width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 1.5; }\n\n        .register-fields {\n          display: flex;\n          width: 100%;\n          flex-direction: column;\n          gap: clamp(14px, 1.82vh, 20px);\n        }\n        .register-password-group {\n          display: flex;\n          width: 100%;\n          flex-direction: column;\n          gap: clamp(8px, .91vh, 10px);\n        }\n        .password-checks {\n          display: flex;\n          width: min(100%, 360px);\n          flex-direction: column;\n          gap: clamp(8px, 1.09vh, 12px);\n        }\n        .password-check {\n          display: flex;\n          align-items: flex-start;\n          gap: 8px;\n          color: #717680;\n          font-size: 14px;\n          line-height: 20px;\n        }\n        .password-check-icon {\n          display: grid;\n          width: 20px;\n          height: 20px;\n          flex: 0 0 20px;\n          place-items: center;\n          border-radius: 999px;\n          color: #717680;\n          background: #252b37;\n          font-size: 12px;\n          font-weight: 700;\n          line-height: 1;\n          transition: color .18s ease, background .18s ease;\n        }\n        .password-check.is-valid .password-check-icon { color: #fff; background: #153ef0; }\n\n        .verification-view .brand-block { width: 100%; }\n        .verification-view .brand-block > div { width: 100%; }\n        .verification-view .auth-description { max-width: 600px; margin-right: auto; margin-left: auto; }\n        .verification-inputs {\n          display: flex;\n          width: 100%;\n          gap: clamp(8px, 1.09vh, 12px);\n        }\n        .verification-input {\n          width: 0;\n          min-width: 0;\n          height: clamp(60px, 7.27vh, 80px);\n          flex: 1 1 0;\n          padding: 8px;\n          border: 1px solid #535862;\n          border-radius: 12px;\n          outline: none;\n          color: #fafafa;\n          background: #181d27;\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .08);\n          font-family: inherit;\n          font-size: clamp(36px, 4.36vh, 48px);\n          font-weight: 500;\n          line-height: 1.25;\n          letter-spacing: -.02em;\n          text-align: center;\n          caret-color: #fff;\n          transition: border-color .18s ease, box-shadow .18s ease;\n        }\n        .verification-input::placeholder { color: #414651; opacity: 1; }\n        .verification-input:focus,\n        .verification-input:not(:placeholder-shown) { border: 2px solid #5573ff; }\n        .verification-form .submit-btn:not(:disabled) {\n          border-color: #581cf0;\n          background: #581cf0;\n          box-shadow: inset 0 0 0 1px rgba(10, 13, 18, .18), inset 0 -2px 0 rgba(10, 13, 18, .05), 0 1px 2px rgba(10, 13, 18, .05);\n        }\n\n        .text-btn {\n          padding: 0;\n          border: 0;\n          color: #3459ff;\n          background: transparent;\n          font-size: 13px;\n          font-weight: 600;\n          cursor: pointer;\n        }\n        .resend-code-btn {\n          align-self: center;\n          padding: 0;\n          border: 0;\n          color: #3459ff;\n          background: transparent;\n          font-family: inherit;\n          font-size: 14px;\n          font-weight: 600;\n          cursor: pointer;\n        }\n        .resend-code-btn:hover:not(:disabled) { color: #5573ff; }\n        .resend-code-btn:disabled { color: #717680; cursor: not-allowed; }\n        .login-password-group {\n          display: flex;\n          width: 100%;\n          flex-direction: column;\n          gap: 8px;\n        }\n        .forgot-btn {\n          align-self: flex-end;\n          margin: 0;\n          color: #fff;\n          line-height: 20px;\n        }\n        .forgot-btn:hover { color: #fff; opacity: .82; }\n        .edit-email-btn { align-self: flex-start; margin-top: -8px; }\n        .step-copy { margin: 0; color: #a4a7ae; font-size: 14px; line-height: 1.5; }\n        .step-copy strong { color: #fff; }\n\n        .submit-btn {\n          width: 100%;\n          height: var(--control-height);\n          margin: 0;\n          border: 1px solid #3459ff;\n          border-radius: 16px;\n          color: #fff;\n          background: linear-gradient(90deg, #3459ff, #6a3bff);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .08);\n          font-size: clamp(16px, 1.46vw, 20px);\n          font-weight: 600;\n          cursor: pointer;\n          transition: opacity .18s ease, transform .18s ease;\n        }\n        .submit-btn:hover:not(:disabled) { transform: translateY(-1px); }\n        .submit-btn:disabled { border-color: #252b37; color: #717680; background: #252b37; cursor: not-allowed; }\n\n        .error-banner, .success-banner {\n          width: 100%;\n          margin-bottom: 16px;\n          padding: 10px 12px;\n          border-radius: 8px;\n          font-size: 13px;\n          line-height: 1.45;\n        }\n        .error-banner { border: 1px solid rgba(248, 113, 113, .3); color: #fda4af; background: rgba(239, 68, 68, .12); }\n        .success-banner { border: 1px solid rgba(74, 222, 128, .28); color: #86efac; background: rgba(34, 197, 94, .1); }\n\n        .account-row {\n          display: flex;\n          width: 100%;\n          min-height: 40px;\n          margin-top: clamp(18px, 2.7vh, 30px);\n          padding-top: clamp(14px, 1.8vh, 20px);\n          align-items: flex-start;\n          justify-content: center;\n          gap: 4px;\n          border-top: 1px solid #414651;\n          color: #717680;\n          font-size: 14px;\n          line-height: 20px;\n        }\n        .account-row button { padding: 0; border: 0; color: #3459ff; background: transparent; font-size: inherit; font-weight: 700; cursor: pointer; }\n\n        .provider-section { display: flex; width: 100%; flex-direction: column; align-items: center; }\n        .provider-buttons { display: flex; width: 100%; flex-direction: column; gap: clamp(12px, 1.82vh, 20px); }\n        .google-provider { position: relative; width: 100%; min-height: clamp(42px, 5.45vh, 60px); }\n        .google-provider.is-ready { overflow: hidden; border: 1px solid #3459ff; border-radius: 12px; background: #202124; }\n        .google-button-host { position: absolute; inset: 0; z-index: 2; display: flex; overflow: hidden; align-items: center; justify-content: center; opacity: 0; }\n        .google-provider.is-ready .google-button-host { opacity: 1; }\n        .google-provider.is-ready .google-fallback { visibility: hidden; }\n        .provider-btn {\n          display: flex;\n          width: 100%;\n          height: clamp(42px, 5.45vh, 60px);\n          padding: 0 20px;\n          align-items: center;\n          justify-content: center;\n          gap: 14px;\n          border: 1px solid #252b37;\n          border-radius: 12px;\n          color: #fff;\n          background: #0a0d12;\n          cursor: pointer;\n          transition: border-color .18s ease, background .18s ease, transform .18s ease;\n        }\n        .provider-btn:hover { border-color: #535862; background: #10141c; transform: translateY(-1px); }\n        .provider-btn > svg { display: block; width: clamp(20px, 2.18vh, 24px); height: clamp(20px, 2.18vh, 24px); }\n        .provider-btn > span:not(.provider-disc):not(.facebook-disc) { font-size: clamp(14px, 1.64vh, 18px); font-weight: 600; }\n        .provider-btn > .provider-disc, .provider-btn > .facebook-disc { display: block; width: clamp(20px, 2.18vh, 24px); height: clamp(20px, 2.18vh, 24px); }\n        .provider-disc { position: relative; border-radius: 50%; background: #283544; }\n        .provider-disc svg { position: absolute; top: 50%; left: 50%; width: clamp(30px, 3.27vh, 36px) !important; height: clamp(30px, 3.27vh, 36px) !important; transform: translate(-50%, -50%); }\n        .facebook-disc { border-radius: 50%; overflow: hidden; }\n        .email-divider { display: flex; width: 100%; margin: clamp(18px, 2.72vh, 30px) 0; align-items: center; color: #a4a7ae; font-size: clamp(14px, 1.64vh, 18px); }\n        .email-divider::before, .email-divider::after { content: \"\"; height: 1px; flex: 1; background: #252b37; }\n        .email-divider span { padding: 0 16px; }\n        .email-provider-btn svg { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 1.8; }\n        .login-email-providers { display: flex; width: 100%; flex-direction: column; align-items: center; }\n        .login-email-or { margin: clamp(28px, 5vh, 55px) 0 clamp(26px, 4.54vh, 50px); color: #a4a7ae; font-size: clamp(16px, 1.82vh, 20px); line-height: 30px; }\n        .social-icon-buttons { display: flex; justify-content: center; gap: 10px; }\n        .social-icon-btn {\n          display: grid;\n          width: clamp(48px, 6.54vh, 72px);\n          height: clamp(48px, 6.54vh, 72px);\n          padding: clamp(12px, 1.82vh, 20px);\n          place-items: center;\n          border: 1px solid #252b37;\n          border-radius: 16px;\n          color: #fff;\n          background: #0a0d12;\n          cursor: pointer;\n          transition: border-color .18s ease, background .18s ease, transform .18s ease;\n        }\n        .social-icon-btn:hover { border-color: #535862; background: #10141c; transform: translateY(-1px); }\n        .social-icon-btn > svg, .social-icon-btn > span, .social-icon-btn span > svg { display: block; width: clamp(24px, 2.54vh, 28px); height: clamp(24px, 2.54vh, 28px); }\n\n        .legal-links {\n          max-width: 600px;\n          margin-top: clamp(30px, 6vh, 66px);\n          color: #414651;\n          font-size: 12px;\n          line-height: 18px;\n          text-align: center;\n        }\n        .legal-links a, .legal-link-label { color: #153ef0; text-decoration: none; }\n\n        @media (max-width: 980px) and (min-width: 768px) {\n          .modal-card { gap: 24px; }\n          .banner-content { padding: 20px 16px; }\n          .form-content { padding-top: 48px; }\n          .auth-description { max-width: 360px; }\n        }\n\n        @media (max-width: 767px) {\n          :host { align-items: flex-end; }\n          .backdrop { backdrop-filter: blur(5px); }\n          .modal-card {\n            display: block;\n            width: min(100vw, 375px);\n            height: auto;\n            max-width: 100vw;\n            max-height: min(94vh, 728px);\n            aspect-ratio: auto;\n            padding: 30px 20px;\n            overflow-y: auto;\n            -ms-overflow-style: none;\n            scrollbar-width: none;\n            -webkit-overflow-scrolling: touch;\n            border: 0;\n            border-radius: 24px 24px 0 0;\n            animation: sheet-in .28s cubic-bezier(.16, 1, .3, 1);\n          }\n          .modal-card::-webkit-scrollbar { display: none; width: 0; height: 0; }\n          @keyframes sheet-in { from { transform: translateY(100%); } to { transform: translateY(0); } }\n          .banner-section, .top-actions { display: none; }\n          .form-section, .form-scroll { display: block; width: 100%; max-height: none; overflow: visible; }\n          .form-content { width: 100%; min-height: 0; padding: 0; }\n          .brand-block { gap: 30px; margin-bottom: 50px; }\n          .vidau-logo { width: 60px; height: 60px; }\n          .auth-heading { font-size: 24px; line-height: 32px; letter-spacing: 0; }\n          .auth-description { margin-top: 6px; font-size: 12px; line-height: 18px; white-space: nowrap; }\n          #auth-form { --control-height: 60px; --form-gap: 30px; gap: var(--form-gap); }\n          .register-fields { gap: 20px; }\n          .register-password-group { gap: 10px; }\n          .password-checks { gap: 12px; }\n          .input-field, .submit-btn { height: 60px; }\n          .input-field { font-size: 18px; }\n          .submit-btn { font-size: 20px; }\n          .forgot-btn { margin-top: 0; }\n          .account-row { width: 100%; margin-top: 30px; padding-top: 20px; }\n          .signup-offer { min-height: 52px; }\n          .provider-buttons { gap: 12px; }\n          .google-provider, .provider-btn { height: 52px; min-height: 52px; }\n          .email-divider { margin: 20px 0; }\n          .login-email-or { margin: 28px 0; }\n          .social-icon-btn { width: 52px; height: 52px; padding: 12px; border-radius: 12px; }\n          .legal-links { margin-top: 30px; }\n          .verification-view { height: min(86.6vh, 728px); min-height: min(86.6vh, 728px); }\n          .verification-view .top-actions { display: flex; }\n          .verification-view .round-action { width: 50px; height: 50px; }\n          .verification-view .brand-block { gap: 30px; margin-bottom: 50px; }\n          .verification-view .auth-description { max-width: 270px; white-space: normal; }\n          .verification-view .auth-main { width: 270px; margin: 0 auto; }\n          .verification-inputs { gap: 12px; }\n          .verification-input { height: 48px; padding: 4px; border-radius: 8px; font-size: 24px; line-height: 32px; }\n        }\n\n        @media (max-width: 360px), (max-height: 700px) and (max-width: 767px) {\n          .modal-card { padding-top: 24px; padding-bottom: 24px; }\n          .brand-block { gap: 18px; margin-bottom: 28px; }\n          #auth-form { --control-height: 52px; --form-gap: 18px; gap: var(--form-gap); }\n          .input-field, .submit-btn { height: 52px; }\n          .account-row { margin-top: 20px; }\n        }\n\n        @media (prefers-reduced-motion: reduce) {\n          .modal-card, .banner-media-slot::after, .banner-step.active .banner-step-progress { animation: none; }\n          .banner-media { transition: none; }\n        }\n      </style>\n\n      <div class=\"backdrop\" id=\"backdrop\"></div>\n      <div class=\"modal-card ${this.mode === 'register-code' || this.mode === 'reset-code' || this.mode === 'login-code' ? 'verification-view' : ''}\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"auth-title\">\n        ${this.renderBannerMarkup()}\n        <section class=\"form-section\">\n          <div class=\"top-actions\">\n            ${!isProviderChoice ? `<button class=\"round-action\" id=\"back-nav\" type=\"button\" aria-label=\"Go back\">\n              <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m15 18-6-6 6-6\"/><path d=\"M9 12h10\"/></svg>\n            </button>` : '<span></span>'}\n            <button class=\"round-action\" id=\"close-btn\" type=\"button\" aria-label=\"Close\">\n              <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m7 7 10 10M17 7 7 17\"/></svg>\n            </button>\n          </div>\n          <div class=\"form-scroll\">\n            <div class=\"form-content\">\n              <div class=\"brand-block\">\n                ${this.renderLogo()}\n                <div>\n                  <h1 class=\"auth-heading\" id=\"auth-title\">${escapeHtml(viewCopy.title)}</h1>\n                  ${viewCopy.description ? `<p class=\"auth-description\">${escapeHtml(viewCopy.description)}</p>` : ''}\n                </div>\n              </div>\n              ${signupOffer}\n              <div class=\"auth-main ${showEmailForm ? '' : 'hidden'}\">\n                ${this.errorMsg ? `<div class=\"error-banner\" role=\"alert\">${escapeHtml(this.errorMsg)}</div>` : ''}\n                ${this.successMsg ? `<div class=\"success-banner\" role=\"status\">${escapeHtml(this.successMsg)}</div>` : ''}\n                ${this.renderAuthForm()}\n                ${showEmailForm ? switchRow : ''}\n              </div>\n              ${showLoginEmailProviders ? `<div class=\"login-email-providers\">\n                <div class=\"login-email-or\">OR</div>\n                <div class=\"social-icon-buttons\">${this.renderSocialIconButtons()}</div>\n              </div>` : ''}\n              ${showProviderChoice ? `<div class=\"provider-section\">\n                <div class=\"provider-buttons\">${this.renderSocialButtons()}</div>\n                ${this.providers.has('email') ? `<div class=\"email-divider\"><span>OR</span></div>\n                  <button class=\"provider-btn email-provider-btn\" id=\"btn-email\" type=\"button\">\n                    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"4\" width=\"19\" height=\"16\" rx=\"3\"/><path d=\"m4 6 8 6 8-6\"/></svg>\n                    <span>Continue with Email</span>\n                  </button>` : ''}\n                ${isProviderChoice ? switchRow : ''}\n              </div>` : ''}\n              ${legal}\n            </div>\n          </div>\n        </section>\n      </div>\n    `;\n\n    this.shadow.innerHTML = html;\n    this.setupListeners();\n    this.scheduleBannerMount();\n    this.mountGoogleButton();\n  }\n\n  private setupListeners() {\n    const backdrop = this.shadow.querySelector('#backdrop');\n    const closeBtn = this.shadow.querySelector('#close-btn');\n    const backNav = this.shadow.querySelector('#back-nav');\n    const tabLogin = this.shadow.querySelector('#tab-login');\n    const tabRegister = this.shadow.querySelector('#tab-register');\n    const form = this.shadow.querySelector<HTMLFormElement>('#auth-form');\n    const verificationInputs = Array.from(this.shadow.querySelectorAll<HTMLInputElement>('.verification-input'));\n    const getVerificationCode = () => verificationInputs.map((input) => input.value).join('');\n\n    const btnGoogle = this.shadow.querySelector('#btn-google');\n    const btnApple = this.shadow.querySelector('#btn-apple');\n    const btnMicrosoft = this.shadow.querySelector('#btn-microsoft');\n    const btnFacebook = this.shadow.querySelector('#btn-facebook');\n    const btnEmail = this.shadow.querySelector('#btn-email');\n    const resendCodeBtn = this.shadow.querySelector<HTMLButtonElement>('#resend-code-btn');\n\n    btnGoogle?.addEventListener('click', () => {\n      trackSignupMethodClick('google');\n      this.handleGoogleLogin();\n    });\n    btnApple?.addEventListener('click', () => {\n      trackSignupMethodClick('apple');\n      this.handleAppleLogin();\n    });\n    btnMicrosoft?.addEventListener('click', () => {\n      trackSignupMethodClick('microsoft');\n      this.handleMicrosoftLogin();\n    });\n    btnFacebook?.addEventListener('click', () => {\n      trackSignupMethodClick('facebook');\n      this.handleFacebookLogin();\n    });\n    btnEmail?.addEventListener('click', () => {\n      this.mode = this.mode === 'register' ? 'register-email' : 'login-email';\n      this.errorMsg = '';\n      this.successMsg = '';\n      this.render();\n    });\n\n    backdrop?.addEventListener('click', () => this.close());\n    closeBtn?.addEventListener('click', () => this.close());\n    backNav?.addEventListener('click', () => {\n      if (this.mode === 'login') {\n        this.close();\n        return;\n      }\n      if (this.mode === 'register-code' || this.mode === 'reset-code' || this.mode === 'login-code') this.clearResendCooldown();\n      if (this.mode === 'register-code' || this.mode === 'reset-code' || this.mode === 'login-code') this.verificationCode = '';\n      this.mode = this.mode === 'register-code'\n        ? 'register-email'\n        : this.mode === 'reset-code'\n          ? 'forgot'\n          : this.mode === 'login-code'\n            ? 'login-email'\n            : this.mode === 'register-email'\n              ? 'register'\n              : this.mode === 'login-email' || this.mode === 'forgot'\n                ? 'login'\n                : 'login';\n      this.errorMsg = '';\n      this.successMsg = '';\n      this.render();\n    });\n\n    this.shadow.querySelectorAll<HTMLElement>('[data-banner-index]').forEach((step) => {\n      step.addEventListener('click', () => this.activateBanner(Number(step.dataset.bannerIndex || 0)));\n    });\n\n    const passwordInput = this.shadow.querySelector<HTMLInputElement>('#password');\n    const passwordToggle = this.shadow.querySelector<HTMLButtonElement>('#password-toggle');\n    const passwordEyeHidden = passwordToggle?.querySelector<SVGElement>('.password-eye-hidden');\n    const passwordEyeVisible = passwordToggle?.querySelector<SVGElement>('.password-eye-visible');\n    const passwordHasSpecialCharacter = (value: string) => /[^A-Za-z0-9\\s]/.test(value);\n    passwordToggle?.addEventListener('click', () => {\n      if (!passwordInput) return;\n      const show = passwordInput.type === 'password';\n      passwordInput.type = show ? 'text' : 'password';\n      passwordToggle.setAttribute('aria-label', show ? 'Hide password' : 'Show password');\n      passwordEyeHidden?.toggleAttribute('hidden', show);\n      passwordEyeVisible?.toggleAttribute('hidden', !show);\n    });\n\n    if (form) {\n      const submit = form.querySelector<HTMLButtonElement>('.submit-btn');\n      const isVerificationView = verificationInputs.length > 0;\n      const updateSubmitState = () => {\n        if (isVerificationView) this.verificationCode = getVerificationCode();\n        const password = passwordInput?.value || '';\n        const hasRequiredLength = password.length >= 8;\n        const hasSpecialCharacter = passwordHasSpecialCharacter(password);\n        this.shadow.querySelector('[data-password-rule=\"length\"]')?.classList.toggle('is-valid', hasRequiredLength);\n        this.shadow.querySelector('[data-password-rule=\"special\"]')?.classList.toggle('is-valid', hasSpecialCharacter);\n        const registrationPasswordIsValid = this.mode !== 'register-email' || (hasRequiredLength && hasSpecialCharacter);\n        const verificationCodeIsValid = (this.mode !== 'register-code' && this.mode !== 'reset-code' && this.mode !== 'login-code') || /^\\d{6}$/.test(this.verificationCode);\n        if (submit) submit.disabled = this.loading || !form.checkValidity() || !registrationPasswordIsValid || !verificationCodeIsValid;\n      };\n      form.querySelectorAll('input:not(.verification-input)').forEach((input) => input.addEventListener('input', updateSubmitState));\n      form.querySelector<HTMLInputElement>('#email')?.addEventListener('input', (event) => {\n        this.email = (event.currentTarget as HTMLInputElement).value;\n      });\n\n      const fillVerificationDigits = (value: string, startIndex = 0) => {\n        const digits = value.replace(/\\D/g, '').slice(0, verificationInputs.length - startIndex);\n        digits.split('').forEach((digit, offset) => {\n          verificationInputs[startIndex + offset].value = digit;\n        });\n        verificationInputs[Math.min(startIndex + digits.length, verificationInputs.length - 1)]?.focus();\n        updateSubmitState();\n      };\n\n      verificationInputs.forEach((input, index) => {\n        input.addEventListener('input', () => {\n          const digits = input.value.replace(/\\D/g, '');\n          if (digits.length > 1) {\n            fillVerificationDigits(digits, index);\n            return;\n          }\n          input.value = digits.slice(-1);\n          if (input.value && index < verificationInputs.length - 1) {\n            verificationInputs[index + 1].focus();\n          }\n          updateSubmitState();\n        });\n        input.addEventListener('keydown', (event) => {\n          if (event.key === 'Backspace' && !input.value && index > 0) {\n            event.preventDefault();\n            verificationInputs[index - 1].value = '';\n            verificationInputs[index - 1].focus();\n            updateSubmitState();\n          } else if (event.key === 'ArrowLeft' && index > 0) {\n            event.preventDefault();\n            verificationInputs[index - 1].focus();\n          } else if (event.key === 'ArrowRight' && index < verificationInputs.length - 1) {\n            event.preventDefault();\n            verificationInputs[index + 1].focus();\n          }\n        });\n      });\n      this.shadow.querySelector('.verification-inputs')?.addEventListener('paste', (event) => {\n        const clipboardData = (event as ClipboardEvent).clipboardData?.getData('text') || '';\n        if (!/\\d/.test(clipboardData)) return;\n        event.preventDefault();\n        verificationInputs.forEach((input) => { input.value = ''; });\n        fillVerificationDigits(clipboardData);\n      });\n      updateSubmitState();\n    }\n\n    this.shadow.querySelector('.modal-card')?.addEventListener('keydown', (event) => {\n      if ((event as KeyboardEvent).key === 'Escape') this.close();\n    });\n\n    tabLogin?.addEventListener('click', () => {\n      this.mode = 'login';\n      this.errorMsg = '';\n      this.successMsg = '';\n      this.render();\n    });\n\n    tabRegister?.addEventListener('click', () => {\n      this.mode = 'register';\n      this.errorMsg = '';\n      this.successMsg = '';\n      this.render();\n    });\n\n    this.shadow.querySelector('#forgot-btn')?.addEventListener('click', () => {\n      this.mode = 'forgot';\n      this.errorMsg = '';\n      this.render();\n    });\n    this.shadow.querySelector('#back-login-btn')?.addEventListener('click', () => {\n      this.mode = 'login';\n      this.errorMsg = '';\n      this.render();\n    });\n    this.shadow.querySelector('#back-edit-btn')?.addEventListener('click', () => {\n      this.clearResendCooldown();\n      this.verificationCode = '';\n      this.mode = this.mode === 'register-code'\n        ? 'register-email'\n        : this.mode === 'login-code'\n          ? 'login-email'\n          : 'forgot';\n      this.errorMsg = '';\n      this.render();\n    });\n    resendCodeBtn?.addEventListener('click', async () => {\n      const resendMode = this.mode;\n      if (this.resending || this.resendCooldownSeconds > 0 || !this.email || (resendMode !== 'register-code' && resendMode !== 'reset-code' && resendMode !== 'login-code')) return;\n\n      const resendType = resendMode === 'register-code'\n        ? 'register'\n        : resendMode === 'login-code'\n          ? 'login'\n          : 'resetPassword';\n      this.resending = true;\n      this.errorMsg = '';\n      this.successMsg = '';\n      this.render();\n\n      try {\n        const res = await api.sendVerificationCode(this.email, resendType);\n        if (res.code !== 0) throw new Error(res.msg || 'Failed to resend verification code');\n        if (this.mode === resendMode) {\n          this.successMsg = 'Verification code resent';\n          this.startResendCooldown();\n        }\n      } catch (error: unknown) {\n        if (this.mode === resendMode) {\n          this.errorMsg = error instanceof Error ? error.message : 'Failed to resend verification code';\n        }\n      } finally {\n        this.resending = false;\n        if (this.mode === resendMode && this.isOpen) this.render();\n      }\n    });\n\n    form?.addEventListener('submit', async (e) => {\n      e.preventDefault();\n      const currentMode = this.mode;\n      const email = (this.shadow.querySelector('#email') as HTMLInputElement | null)?.value.trim() || this.email;\n      const password = (this.shadow.querySelector('#password') as HTMLInputElement | null)?.value || this.password;\n      if (currentMode === 'register-code' || currentMode === 'reset-code' || currentMode === 'login-code') {\n        this.verificationCode = getVerificationCode();\n      }\n      const code = this.verificationCode;\n\n      if ((currentMode === 'login-email' || currentMode === 'register-email' || currentMode === 'forgot') && !email) return;\n      if ((currentMode === 'register-email' || currentMode === 'reset-code') && password.length < 8) {\n        this.errorMsg = 'Password must contain at least 8 characters';\n        this.render();\n        return;\n      }\n      if (currentMode === 'register-email' && !passwordHasSpecialCharacter(password)) {\n        this.errorMsg = 'Password must contain one special character';\n        this.render();\n        return;\n      }\n      if ((currentMode === 'register-code' || currentMode === 'reset-code' || currentMode === 'login-code') && !/^\\d{6}$/.test(code)) return;\n\n      const validateEmail = getUserConfig()?.validateEmail;\n      if (email && validateEmail) {\n        const validation = await validateEmail(email);\n        if (validation === false || typeof validation === 'string') {\n          this.errorMsg = typeof validation === 'string' ? validation : 'Email is not allowed';\n          this.render();\n          return;\n        }\n      }\n\n      this.email = email;\n      this.password = password;\n\n      if (currentMode === 'login-email' || currentMode === 'register-email') {\n        trackSignupMethodClick('email');\n      }\n\n      this.loading = true;\n      this.errorMsg = '';\n      this.successMsg = '';\n      this.render();\n\n      try {\n        if (currentMode === 'login-email') {\n          const res = await api.loginByEmail(email, password);\n          if (api.isNeedLoginVerify(res)) {\n            const sendRes = await api.sendVerificationCode(email, 'login');\n            if (sendRes.code !== 0) throw new Error(sendRes.msg || 'Failed to send verification code');\n            this.mode = 'login-code';\n            this.verificationCode = '';\n            this.startResendCooldown();\n          } else if (res.code !== 0 || !res.data?.token) {\n            throw new Error(res.msg || 'Authentication failed');\n          } else {\n            this.handleOAuthSuccess(res.data.token, res.data.user);\n          }\n        } else if (currentMode === 'login-code') {\n          const res = await api.loginByEmail(email, password, code);\n          if (res.code !== 0 || !res.data?.token) throw new Error(res.msg || 'Authentication failed');\n          this.handleOAuthSuccess(res.data.token, res.data.user);\n        } else if (currentMode === 'register-email') {\n          const res = await api.sendVerificationCode(email, 'register');\n          if (res.code !== 0) throw new Error(res.msg || 'Failed to send verification code');\n          this.mode = 'register-code';\n          this.verificationCode = '';\n          this.successMsg = '';\n          this.startResendCooldown();\n        } else if (currentMode === 'register-code') {\n          const res = await api.registerByCode(email, password, code);\n          if (res.code !== 0 || !res.data?.token) throw new Error(res.msg || 'Registration failed');\n          this.handleOAuthSuccess(res.data.token, res.data.user);\n        } else if (currentMode === 'forgot') {\n          const res = await api.sendVerificationCode(email, 'resetPassword');\n          if (res.code !== 0) throw new Error(res.msg || 'Failed to send reset code');\n          this.mode = 'reset-code';\n          this.verificationCode = '';\n          this.successMsg = 'Reset code sent';\n          this.startResendCooldown();\n        } else if (currentMode === 'reset-code') {\n          const res = await api.resetPassword(email, code, password);\n          if (res.code !== 0) throw new Error(res.msg || 'Password reset failed');\n          if (res.data?.token) {\n            this.handleOAuthSuccess(res.data.token, res.data.user);\n          } else {\n            this.clearResendCooldown();\n            this.mode = 'login-email';\n            this.password = '';\n            this.verificationCode = '';\n            this.successMsg = 'Password reset. You can now sign in.';\n          }\n        }\n      } catch (error: unknown) {\n        this.errorMsg = error instanceof Error ? error.message : 'Server error';\n      } finally {\n        this.loading = false;\n        this.render();\n      }\n    });\n  }\n\n  private handleOAuthSuccess(token: string, user?: VidauUser) {\n    handleLoginSuccess(token, user);\n    this.dispatchEvent(\n      new CustomEvent('vidau:auth-success', {\n        detail: { token, user },\n        bubbles: true,\n        composed: true\n      })\n    );\n    this.close();\n  }\n\n  private async handleGoogleCredential(credential: string) {\n    trackSignupMethodClick('google');\n    this.loading = true;\n    this.errorMsg = '';\n    try {\n      const res = await api.googleOneTapLogin(credential);\n      if (res.code === 0 && res.data?.token) {\n        this.handleOAuthSuccess(res.data.token, res.data.user);\n      } else {\n        this.errorMsg = res.msg || 'Google login failed';\n        this.render();\n      }\n    } catch {\n      this.errorMsg = 'Network error';\n      this.render();\n    } finally {\n      this.loading = false;\n    }\n  }\n\n  private handleGoogleLogin() {\n    this.errorMsg = '';\n    const config = getConfig();\n    if (!(window as any).google?.accounts) {\n      this.errorMsg = 'Google SDK not loaded';\n      this.render();\n      return;\n    }\n    const client = (window as any).google.accounts.oauth2.initTokenClient({\n      client_id: config.googleClientId,\n      scope: 'email profile',\n      callback: async (response: any) => {\n        if (response.access_token) {\n          try {\n            const res = await api.googleLogin(response.access_token);\n            if (res.code === 0 && res.data?.token) {\n              this.handleOAuthSuccess(res.data.token, res.data.user);\n            } else {\n              this.errorMsg = res.msg || 'Google login failed';\n              this.render();\n            }\n          } catch {\n            this.errorMsg = 'Network error';\n            this.render();\n          }\n        }\n      },\n    });\n    client.requestAccessToken();\n  }\n\n  private handleFacebookLogin() {\n    this.errorMsg = '';\n    const FB = (window as any).FB;\n    if (!FB) {\n      this.errorMsg = 'Facebook SDK not loaded';\n      this.render();\n      return;\n    }\n    FB.login((response: any) => {\n      if (response.status === 'connected') {\n        const authResponse = response.authResponse;\n        FB.api('/me', { fields: 'id,name,email' }, async (user: any) => {\n          try {\n            const res = await api.facebookLogin(authResponse.accessToken, authResponse.userID, user);\n            if (res.code === 0 && res.data?.token) {\n              this.handleOAuthSuccess(res.data.token, res.data.user);\n            } else {\n              this.errorMsg = res.msg || 'Facebook login failed';\n              this.render();\n            }\n          } catch {\n            this.errorMsg = 'Network error';\n            this.render();\n          }\n        });\n      }\n    }, { scope: 'email' });\n  }\n\n  private async handleAppleLogin() {\n    this.errorMsg = '';\n    const config = getConfig();\n    const AppleID = (window as any).AppleID;\n    if (!AppleID) {\n      this.errorMsg = 'Apple SDK not loaded';\n      this.render();\n      return;\n    }\n\n    AppleID.auth.init({\n      clientId: config.appleClientId,\n      scope: 'name email',\n      // OAuth providers require a registered callback. Keep this stable across\n      // product routes; the SDK's redirectUrl remains the post-login return URL.\n      redirectURI: normalizeOAuthRedirectUrl(window.location.origin),\n      usePopup: true\n    });\n\n    try {\n      const data = await AppleID.auth.signIn();\n      if (data.authorization?.id_token) {\n        const res = await api.appleLogin(\n          data.authorization.id_token,\n          data.user?.email,\n          data.user?.name ? `${data.user.name.firstName} ${data.user.name.lastName}` : undefined\n        );\n        if (res.code === 0 && res.data?.token) {\n          this.handleOAuthSuccess(res.data.token, res.data.user);\n        } else {\n          this.errorMsg = res.msg || 'Apple login failed';\n          this.render();\n        }\n      }\n    } catch (err: any) {\n      if (err.error !== 'popup_closed_by_user') {\n        this.errorMsg = 'Apple login failed';\n        this.render();\n      }\n    }\n  }\n\n  private async handleMicrosoftLogin() {\n    this.errorMsg = '';\n    const config = getConfig();\n    const msal = (window as any).msal;\n    if (!msal) {\n      this.errorMsg = 'Microsoft SDK not loaded';\n      this.render();\n      return;\n    }\n\n    const msalConfig = {\n      auth: {\n        clientId: config.microsoftClientId,\n        authority: 'https://login.microsoftonline.com/common',\n        redirectUri: normalizeOAuthRedirectUrl(window.location.origin),\n      }\n    };\n\n    const msalInstance = new msal.PublicClientApplication(msalConfig);\n    await msalInstance.initialize();\n\n    try {\n      const loginResponse = await msalInstance.loginPopup({\n        scopes: ['User.Read', 'email', 'profile']\n      });\n      if (loginResponse?.idToken) {\n        const res = await api.microsoftLogin(\n          loginResponse.idToken,\n          loginResponse.account?.username,\n          loginResponse.account?.name\n        );\n        if (res.code === 0 && res.data?.token) {\n          this.handleOAuthSuccess(res.data.token, res.data.user);\n        } else {\n          this.errorMsg = res.msg || 'Microsoft login failed';\n          this.render();\n        }\n      }\n    } catch (err: any) {\n      if (err.errorCode !== 'user_cancelled') {\n        this.errorMsg = 'Microsoft login failed';\n        this.render();\n      }\n    }\n  }\n}\n\nif (!customElements.get('vidau-auth-dialog')) {\n  customElements.define('vidau-auth-dialog', VidauAuthDialog);\n}\n","import { escapeHtml } from '../core/sanitize';\nimport { eventBus } from '../core/event-bus';\nimport { writePricingDialogView } from '../core/activity';\nimport { trackPayModalView } from '../core/analytics';\nimport { getUser, isLoggedIn, validateAndFetchUser } from '../core/auth';\nimport {\n  createCoinOrder,\n  createSubscriptionOrder,\n  getCoinPackages,\n  getIpLocation,\n  getPaymentStatus,\n  getPricing,\n  type CoinPackage,\n  type CreatedPayment,\n  type PaymentChannel,\n  type PriceSetting,\n  type PricingPlan,\n} from '../core/pricing-api';\nimport type { PricingCloseReason, PricingDialogOptions, PricingPaymentResult } from '../types';\n\nconst closeIcon = new URL('./assets/figma-close.svg', import.meta.url).href;\nconst starsIcon = new URL('./assets/figma-stars.svg', import.meta.url).href;\nconst checkIcon = new URL('./assets/figma-check.svg', import.meta.url).href;\nconst diamondIcon = new URL('./assets/figma-diamond.svg', import.meta.url).href;\nconst coinsIcon = new URL('./assets/figma-coins.svg', import.meta.url).href;\nconst coinsMutedIcon = new URL('./assets/figma-coins-muted.svg', import.meta.url).href;\nconst chevronIcon = new URL('./assets/figma-chevron.svg', import.meta.url).href;\nconst PAYMENT_POLL_INTERVAL = 2500;\nconst PAYMENT_POLL_LIMIT = 360;\n\ntype DialogSection = 'plans' | 'credits';\ntype BillingPeriod = 1 | 2;\ntype PaymentMethod = 'STRIPE' | 'ANTOM';\ntype PlanKind = 'lite' | 'starter' | 'business' | 'custom';\nconst CUSTOM_DAILY_VIP_LEVEL = 41;\n\nconst PRICE_LEVEL = {\n  FREE: 1,\n  LITE: 9,\n  STARTER: 14,\n  BUSINESS: 37,\n  BUSINESS1: 38,\n  BUSINESS2: 39,\n  BUSINESS3: 40,\n  ENTERPRISE: 91,\n} as const;\n\nconst BUSINESS_LEVELS = new Set<number>([\n  PRICE_LEVEL.BUSINESS,\n  PRICE_LEVEL.BUSINESS1,\n  PRICE_LEVEL.BUSINESS2,\n  PRICE_LEVEL.BUSINESS3,\n]);\n\ninterface FeatureRow {\n  text: string;\n  enabled: boolean;\n}\n\ninterface DisplayPlan {\n  id: string;\n  kind: PlanKind;\n  name: string;\n  description: string;\n  credits: number;\n  features: FeatureRow[];\n  priceId: string | number | undefined;\n  amount: number;\n  originalAmount: number;\n  discount: number;\n  currency: string;\n  businessTiers: PriceSetting[];\n  vipLevel: number;\n  canPurchase: boolean;\n}\n\nfunction toNumber(value: unknown): number {\n  const number = Number(value);\n  return Number.isFinite(number) ? number : 0;\n}\n\nfunction formatNumber(value: number): string {\n  return toNumber(value).toLocaleString();\n}\n\nfunction formatPrice(value: number): string {\n  const number = toNumber(value);\n  return Number.isInteger(number) ? String(number) : number.toFixed(2).replace(/\\.0+$/, '');\n}\n\nfunction formatDiscount(value: number): number {\n  const number = toNumber(value);\n  return Math.round(number <= 1 ? number * 100 : number);\n}\n\nfunction formatUnitPrice(price: number, credits: number): string {\n  if (!credits) return '$0/credit';\n  const unit = price / credits;\n  return `$${Number(unit.toFixed(4))}/credit`;\n}\n\nfunction planKind(plan: PricingPlan): PlanKind | null {\n  const levels = (plan.settings || []).map((setting) => toNumber(setting.vip_level));\n  if (levels.some((level) => BUSINESS_LEVELS.has(level))) return 'business';\n  if (levels.includes(PRICE_LEVEL.LITE)) return 'lite';\n  if (levels.includes(PRICE_LEVEL.STARTER)) return 'starter';\n  if (levels.some((level) => level !== PRICE_LEVEL.FREE && level !== PRICE_LEVEL.ENTERPRISE)) return 'custom';\n\n  // Keep compatibility with older pricing responses that did not include\n  // vip_level on settings, while still rejecting unknown plan names.\n  const name = plan.name || '';\n  if (/lite/i.test(name)) return 'lite';\n  if (/starter/i.test(name)) return 'starter';\n  if (/business/i.test(name)) return 'business';\n  return null;\n}\n\nfunction userVipLevel(user: Record<string, unknown> | null = getUser() as Record<string, unknown> | null): number {\n  return toNumber(user?.vip_level ?? user?.vipLevel ?? user?.vip_level_id);\n}\n\nfunction userType(user: Record<string, unknown> | null = getUser() as Record<string, unknown> | null): number {\n  return toNumber(user?.user_type ?? user?.userType);\n}\n\nfunction isPaidUser(user: Record<string, unknown> | null): boolean {\n  return userVipLevel(user) > 1;\n}\n\nfunction planVipLevel(kind: PlanKind, setting?: PriceSetting): number {\n  const level = toNumber(setting?.vip_level);\n  if (level) return level;\n  if (kind === 'lite') return PRICE_LEVEL.LITE;\n  if (kind === 'starter') return PRICE_LEVEL.STARTER;\n  if (kind === 'business') return PRICE_LEVEL.BUSINESS;\n  return 0;\n}\n\nfunction isCustomUser(user: Record<string, unknown> | null = getUser() as Record<string, unknown> | null): boolean {\n  return isLoggedIn() && !!user && (userVipLevel(user) === CUSTOM_DAILY_VIP_LEVEL || userType(user) === 6);\n}\n\n/** 官网规则：价格本身可用，当前档位限制在渲染和下单时单独判断。 */\nfunction canPurchasePlan(price: Record<string, any>): boolean {\n  if (!price?.id || price.can_use === false) return false;\n  return true;\n}\n\nfunction isBusinessSetting(setting: PriceSetting): boolean {\n  return BUSINESS_LEVELS.has(toNumber(setting.vip_level));\n}\n\nfunction parseApiRights(rights: string[]): FeatureRow[] {\n  return rights.map((right) => {\n    const trimmed = right.trim();\n    const disabled = /^[-–—×xX]\\s+/.test(trimmed) || trimmed.startsWith('✗');\n    return {\n      text: trimmed,\n      enabled: !disabled,\n    };\n  }).filter((row) => row.text);\n}\n\nfunction creditEquivalents(kind: PlanKind, credits: number): string[] {\n  if (kind === 'custom') return [];\n  return [\n    `= Up to ~${formatNumber(Math.round(credits * 2))} images`,\n    `= Up to ~${formatNumber(Math.round(credits / 30))} videos`,\n  ];\n}\n\nfunction coinPackagesFrom(data: unknown): CoinPackage[] {\n  if (Array.isArray(data)) return data as CoinPackage[];\n  if (!data || typeof data !== 'object') return [];\n  const record = data as Record<string, unknown>;\n  const nested = record.list || record.coins || record.items || record.records;\n  return Array.isArray(nested) ? nested as CoinPackage[] : [];\n}\n\n/** 可嵌入任意前端框架的 Pricing Web Component。 */\nexport class VidauPricingDialog extends HTMLElement {\n  private shadow: ShadowRoot;\n  private isOpen = false;\n  private loading = false;\n  private plans: PricingPlan[] = [];\n  private coinPackages: CoinPackage[] = [];\n  private channels: PaymentChannel[] = ['STRIPE'];\n  private isMainlandChina = false;\n  private activeSection: DialogSection = 'plans';\n  private billingPeriod: BillingPeriod = 1;\n  private paymentMethod: PaymentMethod = 'STRIPE';\n  private businessTierIndex = 0;\n  private options: PricingDialogOptions = {};\n  private paymentTimer: ReturnType<typeof setInterval> | null = null;\n  private paymentPolls = 0;\n  private pendingPayment: { id: string; purchaseType: PricingPaymentResult['purchaseType'] } | null = null;\n  private errorMessage = '';\n  private dialogScroll = 0;\n  private paymentMenuOpen = false;\n\n  constructor() {\n    super();\n    this.shadow = this.attachShadow({ mode: 'open' });\n  }\n\n  connectedCallback() {\n    this.render();\n  }\n\n  disconnectedCallback() {\n    this.stopPaymentPolling();\n  }\n\n  async open(options: PricingDialogOptions = {}) {\n    this.options = options;\n    this.isOpen = true;\n    this.loading = true;\n    this.errorMessage = '';\n    this.activeSection = 'plans';\n    this.billingPeriod = 1;\n    this.businessTierIndex = 0;\n    this.dialogScroll = 0;\n    this.paymentMenuOpen = false;\n    this.render();\n    eventBus.emit('pricing_open', { isPaidUser: this.paidUser });\n    trackPayModalView();\n    writePricingDialogView(this.options.source);\n    await this.loadData();\n  }\n\n  close(reason: PricingCloseReason = 'dismissed') {\n    if (!this.isOpen) return;\n    this.isOpen = false;\n    this.render();\n    this.options.onClose?.(reason);\n    eventBus.emit('pricing_close', { reason });\n  }\n\n  private get paidUser() {\n    return isPaidUser(getUser() as Record<string, unknown> | null);\n  }\n\n  private userStateKey() {\n    return `${this.paidUser ? 1 : 0}:${userVipLevel()}:${userType()}:${isCustomUser() ? 1 : 0}:${this.coinPackages.length}`;\n  }\n\n  private async loadData() {\n    this.loading = true;\n    const knownPaid = this.paidUser;\n    try {\n      const userRefresh = validateAndFetchUser().catch(() => getUser());\n      const [pricingResult, ipResult, coinResult] = await Promise.all([\n        getPricing(),\n        getIpLocation().catch(() => null),\n        knownPaid ? getCoinPackages() : Promise.resolve(null),\n      ]);\n      if (!this.isOpen) return;\n      this.plans = pricingResult.data?.pricings || [];\n      this.channels = pricingResult.data?.pay_channels || ['STRIPE'];\n      this.isMainlandChina = ipResult?.data?.countryCode === 'CN';\n      this.coinPackages = coinPackagesFrom(coinResult?.data);\n      this.loading = false;\n      this.ensurePaymentMethod();\n      this.render();\n\n      const viewBeforeUser = this.userStateKey();\n      await userRefresh;\n      if (!this.isOpen) return;\n      if (this.paidUser && !this.coinPackages.length) {\n        const coins = await getCoinPackages().catch(() => null);\n        if (!this.isOpen) return;\n        this.coinPackages = coinPackagesFrom(coins?.data);\n      }\n      if (this.userStateKey() !== viewBeforeUser) {\n        this.captureScroll();\n        this.render();\n      }\n    } catch (error) {\n      this.errorMessage = error instanceof Error ? error.message : 'Unable to load pricing. Please try again.';\n      this.loading = false;\n      this.ensurePaymentMethod();\n      this.render();\n    }\n  }\n\n  private setBusinessTier(index: number) {\n    if (index === this.businessTierIndex) return;\n    this.captureScroll();\n    this.businessTierIndex = Math.max(0, index);\n    this.render();\n  }\n\n  private get paymentOptions(): Array<{ value: PaymentMethod; label: string }> {\n    const options: Array<{ value: PaymentMethod; label: string }> = [];\n    if (this.channels.includes('STRIPE') || !this.channels.length) {\n      options.push({ value: 'STRIPE', label: 'USD - Stripe' });\n    }\n    const alipayAvailable = this.channels.some((channel) => channel === 'ANTOM' || channel === 'HUIFU');\n    if (this.isMainlandChina && alipayAvailable) {\n      options.push({ value: 'ANTOM', label: 'CNY - Alipay' });\n    }\n    return options.length ? options : [{ value: 'STRIPE', label: 'USD - Stripe' }];\n  }\n\n  private ensurePaymentMethod() {\n    if (!this.paymentOptions.some((option) => option.value === this.paymentMethod)) {\n      this.paymentMethod = this.paymentOptions[0].value;\n    }\n  }\n\n  private businessTierProgress(tierCount: number) {\n    const maxIndex = Math.max(tierCount - 1, 1);\n    return `${(Math.min(this.businessTierIndex, maxIndex) / maxIndex) * 100}%`;\n  }\n\n  private get visiblePlans(): DisplayPlan[] {\n    const normalized = this.plans\n      .map((plan) => {\n        const settings = plan.settings || [];\n        const hasPlanPrice = settings.some((setting) => {\n          const level = toNumber(setting.vip_level);\n          return level !== PRICE_LEVEL.FREE && level !== PRICE_LEVEL.ENTERPRISE && Boolean(setting.prices?.length);\n        });\n        if (!hasPlanPrice) return null;\n\n        const kind = planKind(plan);\n        if (!kind) return null;\n        if (kind === 'custom' && !isCustomUser()) return null;\n\n        const businessTiers = settings.filter(isBusinessSetting);\n        const selectedSetting = kind === 'business'\n          ? businessTiers[Math.min(this.businessTierIndex, Math.max(businessTiers.length - 1, 0))] || settings[0]\n          : kind === 'lite'\n            ? settings.find((setting) => toNumber(setting.vip_level) === PRICE_LEVEL.LITE) || settings[0]\n            : kind === 'starter'\n              ? settings.find((setting) => toNumber(setting.vip_level) === PRICE_LEVEL.STARTER) || settings[0]\n              : settings[0];\n        const price = this.getPrice(selectedSetting);\n        const name = plan.name || 'Plan';\n        const apiRights = Array.isArray(price.rights) ? price.rights : [];\n        const vipLevel = planVipLevel(kind, selectedSetting);\n        return {\n          id: String(plan.id),\n          kind,\n          name,\n          description: plan.desc || this.defaultDescription(kind),\n          credits: toNumber(price.credits_per_month),\n          features: parseApiRights(apiRights),\n          priceId: price.id,\n          amount: toNumber(price.discount_price ?? price.price),\n          originalAmount: toNumber(price.price),\n          discount: toNumber(price.off_per),\n          currency: String(price.currency || (this.paymentMethod === 'ANTOM' ? 'CNY' : 'USD')),\n          businessTiers,\n          vipLevel,\n          canPurchase: canPurchasePlan(price),\n        } as DisplayPlan;\n      })\n      .filter((plan): plan is DisplayPlan => !!plan);\n    // The targeted Starter SKU is a daily custom plan. It is intentionally\n    // unavailable in annual billing, matching the official pricing page.\n    return this.billingPeriod === 1\n      ? normalized\n      : normalized.filter((plan) => plan.kind !== 'custom');\n  }\n\n  private defaultDescription(kind: PlanKind): string {\n    if (kind === 'lite') return 'For agencies and collaborative teams';\n    if (kind === 'starter') return 'Built for expanding creative teams';\n    if (kind === 'custom') return 'A custom plan tailored to your needs';\n    return 'Enterprise-grade security and tailored solutions';\n  }\n\n  private isAtOrBelowCurrentPlan(plan: DisplayPlan): boolean {\n    const level = userVipLevel();\n    return (\n      isLoggedIn() &&\n      Number.isFinite(level) &&\n      plan.vipLevel !== PRICE_LEVEL.FREE &&\n      level >= plan.vipLevel\n    );\n  }\n\n  private canPurchaseDisplayPlan(plan: DisplayPlan): boolean {\n    return plan.canPurchase && !this.isAtOrBelowCurrentPlan(plan);\n  }\n\n  private getPrice(setting: PriceSetting | undefined): Record<string, any> {\n    const outerPrices = setting?.prices || [];\n    const targetPeriod = this.paymentMethod === 'ANTOM' ? 0 : this.billingPeriod;\n    const allPrices: Array<Record<string, any>> = outerPrices.flatMap((outer) => {\n      const items = outer.price_items || [];\n      return items.length ? items.map((item) => ({ ...outer, ...item })) : [outer];\n    });\n    return allPrices.find((price) => toNumber(price.period) === targetPeriod)\n      || allPrices.find((price) => toNumber(price.period) === this.billingPeriod)\n      || allPrices[0]\n      || {};\n  }\n\n  private setBillingPeriod(period: BillingPeriod) {\n    if (this.billingPeriod === period) return;\n    this.captureScroll();\n    this.billingPeriod = period;\n    this.paymentMenuOpen = false;\n    this.render();\n  }\n\n  private scrollRoot() {\n    return this.shadow.querySelector('.dialog-scroll');\n  }\n\n  private captureScroll() {\n    this.dialogScroll = this.scrollRoot()?.scrollTop || 0;\n  }\n\n  private restoreScroll() {\n    const scroller = this.scrollRoot();\n    if (scroller) scroller.scrollTop = this.dialogScroll;\n  }\n\n  private scrollToSection(section: DialogSection) {\n    const scroller = this.scrollRoot();\n    if (!scroller) return;\n    this.activeSection = section;\n    this.syncTabButtons();\n    if (section === 'plans') {\n      scroller.scrollTo({ top: 0, behavior: 'smooth' });\n      return;\n    }\n    const target = this.shadow.getElementById('pricing-credits');\n    if (!target) return;\n    scroller.scrollTo({\n      top: Math.max(0, target.offsetTop - this.toolbarHeight() - 12),\n      behavior: 'smooth',\n    });\n  }\n\n  private toolbarHeight() {\n    return (this.shadow.querySelector('.toolbar') as HTMLElement | null)?.offsetHeight || 0;\n  }\n\n  private syncTabButtons() {\n    this.shadow.querySelectorAll<HTMLButtonElement>('[data-action=\"tab-plans\"], [data-action=\"tab-credits\"]').forEach((button) => {\n      const isCredits = button.dataset.action === 'tab-credits';\n      button.classList.toggle('active', this.activeSection === (isCredits ? 'credits' : 'plans'));\n    });\n  }\n\n  private bindScrollSpy() {\n    const scroller = this.scrollRoot();\n    const toolbar = this.shadow.querySelector('.toolbar') as HTMLElement | null;\n    const credits = this.shadow.getElementById('pricing-credits');\n    if (!scroller) return;\n    const onScroll = () => {\n      if (toolbar) {\n        const stuck = toolbar.getBoundingClientRect().top <= scroller.getBoundingClientRect().top + 1;\n        toolbar.classList.toggle('is-stuck', stuck);\n      }\n      if (!credits) return;\n      const next: DialogSection = credits.offsetTop - scroller.scrollTop <= this.toolbarHeight() + 12 ? 'credits' : 'plans';\n      if (next !== this.activeSection) {\n        this.activeSection = next;\n        this.syncTabButtons();\n      }\n    };\n    scroller.addEventListener('scroll', onScroll, { passive: true });\n    onScroll();\n  }\n\n  private icon(src: string, size = 16) {\n    return `<span class=\"icon\" style=\"width:${size}px;height:${size}px\"><img src=\"${src}\" alt=\"\" width=\"${size}\" height=\"${size}\"></span>`;\n  }\n\n  private renderPlanCards() {\n    if (this.loading) {\n      return '<div class=\"pricing-skeletons\"><i></i><i></i><i></i></div>';\n    }\n    if (!this.visiblePlans.length) return '<p class=\"pricing-empty\">Pricing is temporarily unavailable.</p>';\n    const plans = this.visiblePlans;\n    const businessTierCount = Math.max(plans.find((plan) => plan.kind === 'business')?.businessTiers.length || 0, 1);\n    const dense = plans.length >= 4;\n    return `<div id=\"pricing-plans\" class=\"plans-grid${dense ? ' plans-grid--dense' : ''}\" style=\"--plan-count:${plans.length};--business-tier-count:${businessTierCount}\">${plans.map((plan) => {\n      const symbol = plan.currency === 'CNY' ? '¥' : '$';\n      const discount = formatDiscount(plan.discount);\n      const hasDiscount = discount > 0 && plan.originalAmount > plan.amount;\n      const isDailyCustom = plan.kind === 'custom' && this.billingPeriod === 1;\n      const billed = isDailyCustom\n        ? 'per day'\n        : this.billingPeriod === 2\n          ? 'per month, billed annually'\n          : 'per month, billed monthly';\n      const creditLabel = `${formatNumber(plan.credits)} Credits / ${isDailyCustom ? 'day' : 'mo.'}`;\n      const billingNote = isDailyCustom ? 'Flexible daily billing available' : 'Flexible monthly billing available';\n      const atOrBelow = this.isAtOrBelowCurrentPlan(plan);\n      const isCurrent = atOrBelow && userVipLevel() === plan.vipLevel;\n      const canBuy = this.canPurchaseDisplayPlan(plan);\n      const cta = canBuy\n        ? `Get ${escapeHtml(plan.name)}`\n        : isCurrent\n          ? 'Current plan'\n          : atOrBelow\n            ? 'Upgrade'\n            : 'Current plan';\n      const equivalents = creditEquivalents(plan.kind, plan.credits);\n      const hasTiers = plan.kind === 'business' && plan.businessTiers.length > 1;\n      return `<article class=\"plan-card plan-card--${plan.kind}${canBuy ? '' : ' is-current'}\">\n        <div class=\"plan-top\">\n          <div class=\"plan-heading\">\n            <div class=\"plan-title-row\">\n              <h3>${escapeHtml(plan.name.toUpperCase())}</h3>\n              ${discount ? `<span class=\"off-badge\">${discount}% OFF</span>` : ''}\n              ${plan.kind === 'business' ? `<span class=\"best-badge\">${this.icon(diamondIcon, 10)}BEST VALUE</span>` : ''}\n            </div>\n            <p class=\"plan-description\">${escapeHtml(plan.description)}</p>\n          </div>\n          <div class=\"plan-credit\">\n            <div class=\"credit-main\">${this.icon(starsIcon)}<strong>${escapeHtml(creditLabel)}</strong></div>\n            ${equivalents.map((line) => `<p class=\"credit-eq\">${escapeHtml(line)}</p>`).join('')}\n            ${hasTiers ? `<div class=\"business-tier\">\n              <div class=\"tier-slider\">\n                <span class=\"tier-fill\" style=\"width:${this.businessTierProgress(plan.businessTiers.length)}\"></span>\n                <input type=\"range\" min=\"0\" max=\"${plan.businessTiers.length - 1}\" step=\"1\" value=\"${this.businessTierIndex}\" data-action=\"business-tier\" aria-label=\"Business credits tier\">\n              </div>\n              <div class=\"tier-labels\">${plan.businessTiers.map((tier, index) => {\n                const value = formatNumber(toNumber(this.getPrice(tier).credits_per_month));\n                const active = index === this.businessTierIndex;\n                return `<button type=\"button\" data-action=\"business-tier-label\" data-tier-index=\"${index}\" class=\"${active ? 'active' : ''}\" aria-pressed=\"${active ? 'true' : 'false'}\">${this.icon(active ? coinsIcon : coinsMutedIcon, 16)}${value}</button>`;\n              }).join('')}</div>\n            </div>` : `<div class=\"fixed-amount\">${this.icon(checkIcon, 12)}<span>Fixed amount of ${formatNumber(plan.credits)} credits/${isDailyCustom ? 'day' : 'mo'}</span></div>`}\n          </div>\n          <div class=\"plan-price\">\n            ${hasDiscount ? `<del>${symbol}${formatPrice(plan.originalAmount)}</del>` : ''}\n            <strong>${symbol}${formatPrice(plan.amount)}</strong>\n            <span>${billed}</span>\n          </div>\n        </div>\n        <div class=\"plan-bottom\">\n          <div class=\"cta-block\">\n            <button class=\"primary-button\" ${canBuy ? `data-action=\"buy-plan\" data-plan-id=\"${escapeHtml(plan.id)}\"` : 'disabled'} aria-disabled=\"${canBuy ? 'false' : 'true'}\">${cta}</button>\n            ${hasDiscount\n              ? `<p class=\"plan-discount\"><b>Discount:</b> ${discount}% off</p>`\n              : `<p class=\"plan-discount\">${billingNote}</p>`}\n          </div>\n          ${plan.features.length ? `<ul>${plan.features.map((feature) => `<li class=\"${feature.enabled ? '' : 'disabled'}\"><span>${escapeHtml(feature.text)}</span></li>`).join('')}</ul>` : ''}\n        </div>\n      </article>`;\n    }).join('')}</div>`;\n  }\n\n  private renderCredits() {\n    if (!this.paidUser) return '';\n    if (this.loading) return '<div id=\"pricing-credits\" class=\"credit-skeletons\"><i></i><i></i><i></i><i></i></div>';\n    if (!this.coinPackages.length) {\n      return '<section id=\"pricing-credits\" class=\"credits-section\"><p class=\"pricing-empty\">Credit packs are temporarily unavailable.</p></section>';\n    }\n    return `<section id=\"pricing-credits\" class=\"credits-section\">\n      <div class=\"section-title\">\n        <h2 class=\"title-pc\">Need <em>More?</em> Top up anytime</h2>\n        <h2 class=\"title-mobile\">Buy <em>More Credit</em></h2>\n        <p>One-time credit packs; stack with any plan above</p>\n      </div>\n      <div class=\"credits-grid\">${this.coinPackages.map((coin) => {\n        const unit = formatUnitPrice(toNumber(coin.price_usd), toNumber(coin.coin_number));\n        return `<article class=\"credit-card\">\n          <div class=\"credit-top\">\n            <h3>${formatNumber(coin.coin_number)} Credits</h3>\n            <p>Pay once. Credits add instantly.</p>\n            <strong>$${formatPrice(toNumber(coin.price_usd))}</strong>\n            <div class=\"credit-unit\">${this.icon(starsIcon)}${unit}</div>\n          </div>\n          <button class=\"primary-button\" data-action=\"buy-credit\" data-coin-id=\"${coin.id}\">Purchase Credits</button>\n        </article>`;\n      }).join('')}</div>\n    </section>`;\n  }\n\n  private render() {\n    if (!this.isOpen) {\n      this.shadow.innerHTML = '<style>:host{display:contents}</style>';\n      return;\n    }\n    const paid = this.paidUser;\n    const annual = this.billingPeriod === 2;\n    this.shadow.innerHTML = `<style>${styles}</style>\n      <div class=\"overlay\" role=\"presentation\">\n        <section class=\"dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Pricing\">\n          <button class=\"close\" data-action=\"close\" aria-label=\"Close pricing dialog\">${this.icon(closeIcon, 16)}</button>\n          <div class=\"dialog-scroll\">\n            <header>\n              <h1>${paid ? 'Upgrade your plan' : 'Choose your plan'}</h1>\n              <p>${paid ? 'Upgrade and save more; unlock cost-effective plans built for your workflow' : 'Choose the plan that fits your workflow and start creating more.'}</p>\n            </header>\n            <div class=\"toolbar${paid ? ' toolbar--paid' : ' toolbar--free'}\">\n              ${paid ? `<div class=\"tabs\" role=\"tablist\">\n                <button type=\"button\" data-action=\"tab-plans\" class=\"${this.activeSection === 'plans' ? 'active' : ''}\">Subscription Plans</button>\n                <button type=\"button\" data-action=\"tab-credits\" class=\"${this.activeSection === 'credits' ? 'active' : ''}\">Credits</button>\n              </div>` : ''}\n              <div class=\"controls\">\n                <div class=\"billing\" role=\"group\" aria-label=\"Billing period\">\n                  <button type=\"button\" data-action=\"billing-monthly\" class=\"${annual ? 'muted' : ''}\">Monthly</button>\n                  <input type=\"checkbox\" data-action=\"billing\" ${annual ? 'checked' : ''} aria-label=\"Annual billing\">\n                  <button type=\"button\" data-action=\"billing-annual\" class=\"${annual ? '' : 'muted'}\">Annual</button>\n                </div>\n                <div class=\"pay-select${this.paymentMenuOpen ? ' open' : ''}\">\n                  <button type=\"button\" data-action=\"payment-toggle\" aria-haspopup=\"listbox\" aria-expanded=\"${this.paymentMenuOpen ? 'true' : 'false'}\">${escapeHtml(this.paymentOptions.find((option) => option.value === this.paymentMethod)?.label || 'USD - Stripe')}</button>\n                  <ul role=\"listbox\">${this.paymentOptions.map((option) => `<li><button type=\"button\" role=\"option\" data-action=\"payment-option\" data-value=\"${option.value}\" class=\"${option.value === this.paymentMethod ? 'selected' : ''}\">${escapeHtml(option.label)}</button></li>`).join('')}</ul>\n                </div>\n              </div>\n            </div>\n            ${this.errorMessage ? `<p class=\"error\">${escapeHtml(this.errorMessage)}</p>` : ''}\n            <div class=\"content\">${this.renderPlanCards()}${this.renderCredits()}</div>\n          </div>\n        </section>\n      </div>`;\n    this.bindEvents();\n    this.restoreScroll();\n  }\n\n  private bindEvents() {\n    this.shadow.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n    this.shadow.querySelector('[data-action=\"tab-plans\"]')?.addEventListener('click', () => this.scrollToSection('plans'));\n    this.shadow.querySelector('[data-action=\"tab-credits\"]')?.addEventListener('click', () => this.scrollToSection('credits'));\n    this.shadow.querySelector('[data-action=\"billing-monthly\"]')?.addEventListener('click', () => this.setBillingPeriod(1));\n    this.shadow.querySelector('[data-action=\"billing-annual\"]')?.addEventListener('click', () => this.setBillingPeriod(2));\n    this.shadow.querySelector<HTMLInputElement>('[data-action=\"billing\"]')?.addEventListener('change', (event) => {\n      this.setBillingPeriod((event.currentTarget as HTMLInputElement).checked ? 2 : 1);\n    });\n    this.shadow.querySelector('[data-action=\"payment-toggle\"]')?.addEventListener('click', (event) => {\n      event.stopPropagation();\n      this.paymentMenuOpen = !this.paymentMenuOpen;\n      this.shadow.querySelector('.pay-select')?.classList.toggle('open', this.paymentMenuOpen);\n      (event.currentTarget as HTMLElement).setAttribute('aria-expanded', String(this.paymentMenuOpen));\n    });\n    this.shadow.querySelectorAll<HTMLElement>('[data-action=\"payment-option\"]').forEach((button) => {\n      button.addEventListener('click', (event) => {\n        event.stopPropagation();\n        const next = button.dataset.value as PaymentMethod;\n        this.paymentMenuOpen = false;\n        if (next === this.paymentMethod) {\n          this.shadow.querySelector('.pay-select')?.classList.remove('open');\n          return;\n        }\n        this.captureScroll();\n        this.paymentMethod = next;\n        this.render();\n      });\n    });\n    this.shadow.querySelector('.pay-select')?.addEventListener('click', (event) => event.stopPropagation());\n    this.shadow.querySelector('.dialog')?.addEventListener('click', () => {\n      if (!this.paymentMenuOpen) return;\n      this.paymentMenuOpen = false;\n      this.shadow.querySelector('.pay-select')?.classList.remove('open');\n      this.shadow.querySelector('[data-action=\"payment-toggle\"]')?.setAttribute('aria-expanded', 'false');\n    });\n    this.shadow.querySelector<HTMLInputElement>('[data-action=\"business-tier\"]')?.addEventListener('input', (event) => {\n      this.setBusinessTier(toNumber((event.currentTarget as HTMLInputElement).value));\n    });\n    this.shadow.querySelectorAll<HTMLButtonElement>('[data-action=\"business-tier-label\"]').forEach((button) => {\n      button.addEventListener('click', () => {\n        this.setBusinessTier(toNumber(button.dataset.tierIndex));\n      });\n    });\n    this.shadow.querySelectorAll<HTMLElement>('[data-action=\"buy-plan\"]').forEach((button) => {\n      button.addEventListener('click', () => {\n        const plan = this.visiblePlans.find((item) => item.id === button.dataset.planId);\n        if (plan && this.canPurchaseDisplayPlan(plan)) void this.buyPlan(plan);\n      });\n    });\n    this.shadow.querySelectorAll<HTMLElement>('[data-action=\"buy-credit\"]').forEach((button) => {\n      button.addEventListener('click', () => {\n        const coin = this.coinPackages.find((item) => String(item.id) === button.dataset.coinId);\n        if (coin) void this.buyCredit(coin);\n      });\n    });\n    this.shadow.querySelector('.overlay')?.addEventListener('click', (event) => {\n      if (event.target === event.currentTarget) this.close();\n    });\n    this.bindScrollSpy();\n  }\n\n  private get returnUrl(): string {\n    const fallback = window.location.href;\n    try { return new URL(this.options.returnUrl || fallback, fallback).href; } catch { return fallback; }\n  }\n\n  private async buyPlan(plan: DisplayPlan) {\n    if (!this.canPurchaseDisplayPlan(plan) || !plan.priceId) return;\n    const popup = this.openPaymentWindow();\n    try {\n      const response = await createSubscriptionOrder({\n        renew: 1,\n        currency: this.paymentMethod === 'ANTOM' ? 'CNY' : 'USD',\n        price_id: plan.priceId,\n        cancelUrl: this.returnUrl,\n        successUrl: this.returnUrl,\n        channel: '',\n        device: 'web',\n        web_url: this.returnUrl,\n        last_web_url: [this.returnUrl],\n        referral_code: '',\n        subscriptionChannel: this.paymentMethod,\n        pricing_entry: 'dialog',\n      });\n      if (response.code !== 0) {\n        throw new Error(response.msg || 'Unable to create the payment.');\n      }\n      this.handleCreatedPayment(response.data || {}, 'subscription', popup);\n    } catch (error) {\n      popup?.close();\n      this.fail('', 'subscription', error instanceof Error ? error.message : 'Unable to create the payment.');\n    }\n  }\n\n  private async buyCredit(coin: CoinPackage) {\n    const popup = this.openPaymentWindow();\n    try {\n      const response = await createCoinOrder({\n        coin_setting_id: coin.id,\n        cancelUrl: this.returnUrl,\n        successUrl: this.returnUrl,\n        pricing_entry: 'dialog',\n        web_url: this.returnUrl,\n      });\n      if (response.code !== 0) {\n        throw new Error(response.msg || 'Unable to create the payment.');\n      }\n      this.handleCreatedPayment(response.data || {}, 'credits', popup);\n    } catch (error) {\n      popup?.close();\n      this.fail('', 'credits', error instanceof Error ? error.message : 'Unable to create the payment.');\n    }\n  }\n\n  private openPaymentWindow() {\n    const popup = window.open('about:blank', '_blank');\n    if (popup) popup.document.title = 'VidAU payment';\n    return popup;\n  }\n\n  private handleCreatedPayment(created: CreatedPayment, purchaseType: PricingPaymentResult['purchaseType'], popup: Window | null) {\n    const payment = created.payment;\n    const paymentId = String(created.strPaymentId || created.payment_id || payment?.customData?.paymentId || '');\n    if (!payment?.payment_link) {\n      popup?.close();\n      this.fail(paymentId, purchaseType, 'Payment could not be started.');\n      return;\n    }\n    // The official pricing page only requires payment_link to open Stripe.\n    // Some successful subscription responses do not include a payment ID, so\n    // status polling is optional and must not block checkout navigation.\n    this.stopPaymentPolling();\n    eventBus.emit('payment_started', { paymentId, purchaseType });\n    popup ? popup.location.replace(payment.payment_link) : window.location.assign(payment.payment_link);\n    if (paymentId) this.startPaymentPolling(paymentId, purchaseType);\n  }\n\n  private startPaymentPolling(paymentId: string, purchaseType: PricingPaymentResult['purchaseType']) {\n    this.stopPaymentPolling();\n    this.pendingPayment = { id: paymentId, purchaseType };\n    this.paymentPolls = 0;\n    const check = () => void this.checkPaymentStatus();\n    check();\n    this.paymentTimer = setInterval(check, PAYMENT_POLL_INTERVAL);\n  }\n\n  private async checkPaymentStatus() {\n    if (!this.pendingPayment || this.paymentPolls++ >= PAYMENT_POLL_LIMIT) return this.stopPaymentPolling();\n    try {\n      const status = toNumber((await getPaymentStatus(this.pendingPayment.id)).data?.pay_status);\n      if (status === 1) {\n        const pending = this.pendingPayment;\n        this.stopPaymentPolling();\n        const user = await validateAndFetchUser({ force: true });\n        const result: PricingPaymentResult = { paymentId: pending.id, purchaseType: pending.purchaseType, status: 'success', user };\n        this.options.onSuccess?.(result);\n        eventBus.emit('payment_success', result);\n        this.close('completed');\n      } else if ([2, 3, 7].includes(status)) {\n        const pending = this.pendingPayment;\n        this.stopPaymentPolling();\n        this.fail(pending.id, pending.purchaseType, 'Payment was not completed.');\n      }\n    } catch {\n      // A temporary network error must not turn an in-flight payment into a failure.\n    }\n  }\n\n  private stopPaymentPolling() {\n    if (this.paymentTimer) clearInterval(this.paymentTimer);\n    this.paymentTimer = null;\n    this.pendingPayment = null;\n  }\n\n  private fail(paymentId: string, purchaseType: PricingPaymentResult['purchaseType'], message = 'Payment was not completed.') {\n    this.errorMessage = message;\n    const result: PricingPaymentResult = { paymentId, purchaseType, status: 'failed', user: getUser() };\n    this.options.onFailure?.(result);\n    eventBus.emit('payment_failed', result);\n    this.render();\n  }\n}\n\nconst styles = `\n:host{font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:#fff}\n*,*:before,*:after{box-sizing:border-box}\n.icon{display:inline-grid;place-items:center;overflow:clip;flex:0 0 auto}\n.icon img{display:block;width:100%;height:100%;object-fit:contain}\n.overlay{position:fixed;inset:0;z-index:inherit;display:grid;place-items:center;padding:10vh 24px;background:rgba(3,5,9,.78);backdrop-filter:blur(8px)}\n.dialog{position:relative;display:flex;flex-direction:column;width:min(1200px,100%);height:80vh;max-height:80vh;overflow:hidden;border:1px solid rgba(255,255,255,.1);border-radius:24px;background:#0a0d12;box-shadow:0 30px 80px rgba(0,0,0,.55)}\n.dialog-scroll{position:relative;flex:1;min-height:0;overflow:auto;padding:0 56px 48px;background:#0a0d12}\n.close{position:absolute;right:24px;top:16px;z-index:6;display:grid;place-items:center;width:35px;height:35px;padding:5px;border:1px solid rgba(255,255,255,.1);border-radius:10px;background:#181d27;cursor:pointer}\n.close:hover{filter:brightness(1.15)}\n.close .icon{width:16px !important;height:16px !important}\nheader{text-align:center;margin:0 0 8px;padding-top:16px}\nh1{margin:0;color:#fff;font-size:42px;line-height:1.15;letter-spacing:-1.2px}\nheader p{margin:14px auto 0;max-width:746px;color:rgba(255,255,255,.62);font-size:16px}\n.toolbar{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;gap:18px;width:auto;margin:0 -56px 16px;padding:16px 56px;background:#0a0d12}\n.toolbar.is-stuck{padding-right:72px}\n.toolbar--free{justify-content:center}\n.tabs{display:flex;width:426px;padding:5px;border:1px solid rgba(255,255,255,.05);border-radius:12px;background:rgba(255,255,255,.05)}\n.tabs button{width:50%;height:32px;border:1px solid transparent;border-radius:8px;color:rgba(255,255,255,.64);background:transparent;font:600 14px inherit;cursor:pointer}\n.tabs button.active{color:#fff;border-color:rgba(255,255,255,.05);background:rgba(255,255,255,.05)}\n.controls{display:flex;align-items:center;gap:14px}\n.billing{display:flex;align-items:center;gap:10px;height:42px;padding:0 10px;border:1px solid rgba(253,253,253,.1);border-radius:8px;background:transparent}\n.billing button{border:0;background:transparent;color:#fff;font:500 12px inherit;cursor:pointer;padding:0}\n.billing .muted{color:#a4a7ae}\n.billing input{appearance:none;-webkit-appearance:none;position:relative;width:40px;height:20px;margin:0;border:0;border-radius:999px;background:#555;cursor:pointer}\n.billing input:after{content:'';position:absolute;top:0;left:0;width:20px;height:20px;border-radius:50%;background:#fff;transition:transform .2s}\n.billing input:checked{background:#3459ff}\n.billing input:checked:after{transform:translateX(20px)}\n.pay-select{position:relative}\n.pay-select>button{height:42px;min-width:140px;padding:0 32px 0 12px;border:1px solid rgba(253,253,253,.1);border-radius:8px;background:#181d27;color:#d5d7da;font:500 12px inherit;text-align:left;cursor:pointer}\n.pay-select:after{content:'';position:absolute;right:10px;top:13px;width:16px;height:16px;background:url('${chevronIcon}') center/16px no-repeat;pointer-events:none}\n.pay-select ul{display:none;position:absolute;right:0;top:calc(100% + 4px);z-index:6;min-width:100%;margin:0;padding:6px;list-style:none;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:#181d27;box-shadow:0 12px 32px rgba(0,0,0,.4)}\n.pay-select.open ul{display:grid}\n.pay-select li button{width:100%;height:32px;padding:0 10px;border:0;border-radius:6px;background:transparent;color:#fff;font:500 12px inherit;text-align:left;cursor:pointer}\n.pay-select li button.selected,.pay-select li button:hover{background:rgba(255,255,255,.08)}\n  .plans-grid{display:grid;grid-template-columns:repeat(var(--plan-count,3),minmax(0,1fr));grid-auto-rows:1fr;gap:20px;align-items:stretch}\n  .plan-card,.credit-card{display:flex;flex-direction:column;overflow:hidden;min-width:0;border-radius:20px;background:#0a0d12}\n  .plan-card{position:relative;min-height:0}\n  .plan-card:before{position:absolute;inset:0;border-radius:20px;pointer-events:none;content:''}\n  .plan-card--lite:before{background:linear-gradient(180deg,rgba(52,89,255,.15) 0%,rgba(52,89,255,.09) 18%,rgba(52,89,255,.03) 38%,rgba(52,89,255,0) 72%),radial-gradient(ellipse 58% 220% at 3% 42%,rgba(52,89,255,.094) 0%,rgba(52,89,255,.035) 42%,rgba(52,89,255,.01) 100%)}\n  .plan-card--starter:before{background:linear-gradient(180deg,rgba(106,59,255,.15) 0%,rgba(106,59,255,.09) 18%,rgba(106,59,255,.03) 38%,rgba(106,59,255,0) 72%),radial-gradient(ellipse 58% 220% at 3% 42%,rgba(106,59,255,.094) 0%,rgba(106,59,255,.035) 42%,rgba(106,59,255,.01) 100%)}\n  .plan-card--business:before{background:linear-gradient(180deg,rgba(255,45,158,.15) 0%,rgba(255,45,158,.09) 18%,rgba(255,45,158,.03) 38%,rgba(255,45,158,0) 72%),radial-gradient(ellipse 58% 220% at 3% 42%,rgba(255,45,158,.094) 0%,rgba(255,45,158,.035) 42%,rgba(255,45,158,.01) 100%)}\n  .plan-card--custom:before{background:linear-gradient(180deg,rgba(0,194,162,.16) 0%,rgba(0,194,162,.09) 18%,rgba(0,194,162,.03) 38%,rgba(0,194,162,0) 72%),radial-gradient(ellipse 58% 220% at 3% 42%,rgba(0,194,162,.1) 0%,rgba(0,194,162,.035) 42%,rgba(0,194,162,.01) 100%)}\n  .plan-top,.plan-bottom{position:relative;z-index:1}\n  .plan-top{display:flex;flex-direction:column;gap:12px;padding:16px 16px 0;min-width:0}\n.plan-heading{display:grid;gap:4px}\n.plan-title-row{display:flex;align-items:center;gap:4px;flex-wrap:wrap}\n.plan-card h3{margin:0;font-size:24px;line-height:32px}\n.off-badge,.best-badge{display:inline-flex;align-items:center;gap:2px;height:15px;padding:0 5px 0 3px;border-radius:2px;color:#fff;font-size:12px;font-weight:700;transform:skewX(-11deg)}\n.off-badge>*,.best-badge>*{transform:skewX(11deg)}\n.off-badge{background:#ff2d9e}\n.best-badge{background:#6a3bff}\n.plan-description{margin:0;color:rgba(255,255,255,.5);font-size:10px;line-height:18px}\n.plan-credit{display:grid;gap:10px;padding:12px;border-radius:12px;background:rgba(255,255,255,.05);min-width:0;overflow:hidden}\n.credit-main{display:flex;align-items:center;gap:8px}\n.credit-main strong{font-size:14px;font-weight:600}\n.credit-eq{margin:0 0 0 28px;color:rgba(255,255,255,.5);font-size:12px;line-height:18px}\n.fixed-amount{display:flex;align-items:center;justify-content:center;gap:4px;box-sizing:border-box;width:100%;max-width:100%;min-width:0;padding:8px 12px;border:.5px solid #717680;border-radius:4px;color:#a4a7ae;font-size:12px;font-weight:600;overflow:hidden}\n.fixed-amount .icon{width:12px;height:12px;flex:0 0 12px}\n.fixed-amount span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.plan-price{display:flex;align-items:flex-end;gap:4px}\n.plan-price strong{font-size:30px;line-height:38px}\n.plan-price del{position:relative;color:#ff005b;font-size:24px;font-weight:700;text-decoration:none}\n.plan-price del:after{content:'';position:absolute;left:0;right:0;top:50%;height:2px;background:#ff005b;transform:rotate(-7deg)}\n.plan-price span{padding-bottom:2px;color:rgba(255,255,255,.5);font-size:12px}\n  .plan-bottom{display:flex;flex:1;flex-direction:column;gap:16px;padding:12px 12px 16px}\n.cta-block{border:1px solid rgba(255,255,255,.05);border-radius:12px;background:rgba(255,255,255,.05);overflow:hidden}\n.primary-button{position:relative;width:100%;height:48px;border:0;border-radius:10px;color:#fff;font:600 14px inherit;cursor:pointer;box-shadow:inset 0 -3px rgba(0,0,0,.32),0 6px 4px rgba(0,0,0,.25),0 32px 24px rgba(0,0,0,.15)}\n.plan-card--lite .primary-button{background:linear-gradient(182deg,rgba(52,89,255,0) 12.7%,#3459ff 75.8%),#0127d2}\n.plan-card--starter .primary-button{background:linear-gradient(182deg,rgba(106,59,255,0) 12.7%,#6a3bff 75.8%),#3f18bb}\n  .plan-card--business .primary-button{background:linear-gradient(182deg,rgba(255,45,158,0) 12.7%,#ff2d9e 75.8%),#ba0265}\n  .plan-card--custom .primary-button{background:linear-gradient(182deg,rgba(0,194,162,0) 12.7%,#00c2a2 75.8%),#087f75}\n.credit-card .primary-button{background:linear-gradient(183deg,rgba(106,59,255,0) 12.7%,#6a3bff 75.8%),#3810b7}\n.primary-button:hover:not(:disabled){filter:brightness(1.08)}\n.primary-button:disabled{cursor:not-allowed;opacity:.58;filter:none}\n.plan-discount{margin:0;padding:8px;text-align:center;color:rgba(255,255,255,.5);font-size:12px}\n.plan-discount b{color:#fff;font-weight:600}\n.plan-card ul{display:grid;gap:10px;margin:0;padding:0;list-style:none}\n.plan-card li{display:flex;align-items:center;gap:4px;color:#fff;font-size:14px;line-height:20px}\n.plan-card li.disabled{color:#717680}\n.business-tier{display:grid;gap:8px;width:100%;min-width:0}\n.tier-slider{position:relative;display:block;width:100%;height:16px}\n.tier-slider:before{content:'';position:absolute;left:0;right:0;top:50%;height:5px;margin-top:-2.5px;border-radius:999px;background:#414651;pointer-events:none}\n.tier-fill{position:absolute;left:0;top:50%;height:5px;margin-top:-2.5px;border-radius:999px;background:#ba0265;pointer-events:none}\n.business-tier input[type=range]{-webkit-appearance:none;appearance:none;position:relative;z-index:1;display:block;width:100%;min-width:0;max-width:100%;height:16px;margin:0;padding:0;background:transparent;cursor:pointer}\n.business-tier input[type=range]:focus{outline:none}\n.business-tier input[type=range]::-webkit-slider-runnable-track{height:5px;border:0;border-radius:999px;background:transparent}\n.business-tier input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;margin-top:-5.5px;border:1.3px solid #ba0265;border-radius:50%;background:#fafafa}\n.business-tier input[type=range]::-moz-range-track{height:5px;border:0;border-radius:999px;background:transparent}\n.business-tier input[type=range]::-moz-range-progress{height:5px;border:0;border-radius:999px;background:transparent}\n.business-tier input[type=range]::-moz-range-thumb{width:16px;height:16px;border:1.3px solid #ba0265;border-radius:50%;background:#fafafa}\n.tier-labels{display:flex;align-items:flex-start;gap:4px;width:100%;min-width:0;padding:0}\n.tier-labels button{display:flex;flex:1;align-items:center;justify-content:center;gap:4px;min-width:0;border:0;padding:0;background:transparent;color:#717680;font:400 12px inherit;cursor:pointer}\n.tier-labels button:first-child{justify-content:flex-start}\n.tier-labels button:last-child{justify-content:flex-end}\n.tier-labels .active{color:#fff}\n  .tier-labels .active .icon img{filter:brightness(0) invert(1)}\n  @media (min-width:901px){\n    .plans-grid--dense .tier-labels{display:grid;grid-template-columns:repeat(var(--business-tier-count,4),minmax(0,1fr));gap:0;padding:0 4px}\n    .plans-grid--dense .tier-labels button,.plans-grid--dense .tier-labels button:first-child,.plans-grid--dense .tier-labels button:last-child{justify-content:center;gap:2px;overflow:hidden;font-size:10px}\n    .plans-grid--dense .tier-labels button .icon{width:12px !important;height:12px !important}\n  }\n.credits-section{padding-top:80px}\n.section-title{text-align:center;margin:0 0 50px}\n.section-title h2{margin:0;font-size:48px;letter-spacing:-.96px}\n.section-title .title-mobile{display:none}\n.section-title em{color:#6a3bff;font-style:normal}\n.section-title p{margin:10px 0 0;color:rgba(255,255,255,.62);font-size:18px}\n.credits-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}\n.credit-card{min-height:252px;background:radial-gradient(circle at 8% 42%,rgba(106,59,255,.16),transparent 48%),linear-gradient(180deg,rgba(106,59,255,.15),rgba(106,59,255,0) 72%),#0a0d12}\n.credit-top{display:grid;gap:12px;padding:16px 16px 0;text-align:center}\n.credit-card h3{margin:0;font-size:24px;line-height:32px}\n.credit-card> .credit-top p{margin:0;color:rgba(255,255,255,.5);font-size:10px}\n.credit-card strong{display:block;font-size:30px;line-height:38px}\n.credit-unit{display:flex;align-items:center;justify-content:center;gap:8px;padding:12px;border-radius:12px;background:rgba(255,255,255,.05);font-size:14px;font-weight:600}\n.credit-card .primary-button{margin:12px;width:calc(100% - 24px)}\n.pricing-skeletons,.credit-skeletons{display:grid;gap:20px}\n.pricing-skeletons{grid-template-columns:repeat(3,1fr)}\n.credit-skeletons{grid-template-columns:repeat(4,1fr);margin-top:80px}\n.pricing-skeletons i,.credit-skeletons i{height:520px;border-radius:20px;background:linear-gradient(110deg,#121722 25%,#1d2330 40%,#121722 55%);background-size:200% 100%;animation:shimmer 1.2s linear infinite}\n.credit-skeletons i{height:252px}\n.pricing-empty,.error{text-align:center;color:rgba(255,255,255,.65);padding:30px}\n.error{padding:0;color:#ff9bbd}\n@keyframes shimmer{to{background-position-x:-200%}}\n@media (max-width: 900px) {\n  .overlay{place-items:center;padding:10dvh 8px}\n  .dialog{width:100%;height:80dvh;max-height:80dvh;min-height:0;border-radius:20px;background:#12161e}\n  .dialog-scroll{padding:0 10px 24px;background:#12161e}\n  .toolbar{margin:0 -10px 16px;padding:12px 10px;background:#12161e}\n  .toolbar.is-stuck{padding-right:48px}\n  .close{right:10px;top:12px;width:28px;height:28px;padding:4px;border-radius:8px}\n  .close .icon{width:13px !important;height:13px !important}\n  header{margin:0 0 4px;padding:12px 40px 0}\n  header p{display:none}\n  h1{font-size:30px;line-height:38px;letter-spacing:0}\n  .toolbar{flex-direction:column;align-items:center;justify-content:center}\n  .tabs{width:100%}\n  .controls{justify-content:center;flex-wrap:nowrap;gap:14px}\n  .plans-grid,.pricing-skeletons{grid-template-columns:1fr;gap:20px}\n  .plan-heading{justify-items:center;text-align:center}\n  .plan-title-row,.credit-main,.plan-price{justify-content:center;text-align:center}\n  .plan-description{text-align:center}\n  .credit-eq{margin-left:0;text-align:center}\n  .cta-block{width:100%}\n  .plan-card ul{display:none}\n  .credits-section{padding-top:20px}\n  .section-title{margin:0 0 10px}\n  .section-title .title-pc{display:none}\n  .section-title .title-mobile{display:block}\n  .section-title h2{font-size:30px;letter-spacing:0}\n  .section-title p{margin:10px 0 0;font-size:14px;line-height:20px}\n  .credits-grid,.credit-skeletons{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:0}\n  .credit-skeletons i{height:148px}\n  .credit-card{min-height:148px;align-items:center;justify-content:center;gap:11px;padding:16px 8px;border-radius:24px;background:rgba(106,59,255,.1)}\n  .credit-top{display:flex;flex-direction:column;align-items:center;gap:4px;padding:0;width:100%}\n  .credit-card h3{order:1;font-size:12px;line-height:18px;font-weight:500}\n  .credit-card .credit-top p{display:none}\n  .credit-unit{order:2;width:fit-content;min-height:17px;padding:2px 8px;border-radius:8px;font-size:8px;font-weight:400;gap:2px}\n  .credit-unit .icon{width:7px !important;height:7px !important}\n  .credit-card strong{order:3;font-size:20px;line-height:30px}\n  .credit-card .primary-button{margin:0;width:min(153px,100%);height:28px;font-size:14px;box-shadow:none}\n}\n`;\n\nif (!customElements.get('vidau-pricing-dialog')) {\n  customElements.define('vidau-pricing-dialog', VidauPricingDialog);\n}\n","import { getAffiliateCode } from './core/affiliate';\n/**\n * VidAU SSO SDK — 入口\n *\n * 使用方式：\n *\n * 1. CDN 引入：\n *    <script src=\"https://sso.vidau.ai/sdk/vidau-sso.min.js\"></script>\n *    <script>\n *      VidauSSO.init({ appId: 'my-app' });\n *      VidauSSO.login();\n *    </script>\n *\n * 2. npm 引入：\n *    import { VidauSSO } from '@vidau/sso-sdk';\n *    VidauSSO.init({ appId: 'my-app' });\n *    VidauSSO.login();\n */\nimport type {\n  PricingDialogOptions,\n  SSOEventHandler,\n  SSOEventType,\n  VidauSSOConfig,\n  VidauUser,\n} from './types';\nimport { initConfig } from './core/config';\nimport { setDebugMode } from './core/api';\nimport {\n  setUserConfig,\n  getToken as _getToken,\n  isLoggedIn as _isLoggedIn,\n  getUser as _getUser,\n  getUserConfig,\n  clearToken,\n  logout as _logout,\n  validateAndFetchUser,\n  setInitialized,\n  getInitialized,\n} from './core/auth';\nimport { eventBus } from './core/event-bus';\nimport { trackPricingPageView } from './core/activity';\nimport { initAnalytics, resetAnalyticsBindings } from './core/analytics';\nimport {\n  getSessionSyncSource,\n  subscribeToSessionSync,\n} from './core/session-sync';\nimport './auth-dialog/vidau-auth-dialog';\nimport type { VidauAuthDialog } from './auth-dialog/vidau-auth-dialog';\nimport './pricing-dialog/vidau-pricing-dialog';\nimport type { VidauPricingDialog } from './pricing-dialog/vidau-pricing-dialog';\n\nlet authDialog: VidauAuthDialog | null = null;\nlet pricingDialog: VidauPricingDialog | null = null;\nlet zIndex = 2147483647;\nlet unsubscribeSessionSync: (() => void) | null = null;\nlet pricingAfterLogin: PricingDialogOptions | null = null;\nlet pricingHeaderListenerBound = false;\n\nfunction bindPricingHeaderListener() {\n  if (pricingHeaderListenerBound || typeof window === 'undefined') return;\n  pricingHeaderListenerBound = true;\n  window.addEventListener('vidau:pricing-open', (event) => {\n    event.preventDefault();\n    const source = (event as CustomEvent<{ source?: string }>).detail?.source;\n    VidauSSO.openPricing(source ? { source } : {});\n  });\n}\n\nfunction getAuthDialog() {\n  if (!authDialog) {\n    authDialog = document.createElement('vidau-auth-dialog') as VidauAuthDialog;\n    authDialog.style.zIndex = zIndex.toString();\n    document.body.appendChild(authDialog);\n  }\n  return authDialog;\n}\n\nfunction getPricingDialog() {\n  if (!pricingDialog) {\n    pricingDialog = document.createElement('vidau-pricing-dialog') as VidauPricingDialog;\n    pricingDialog.style.zIndex = zIndex.toString();\n    document.body.appendChild(pricingDialog);\n  }\n  return pricingDialog;\n}\n\nfunction open() {\n  getAuthDialog().open('login');\n}\n\nfunction close() {\n  if (authDialog) {\n    authDialog.close();\n  }\n}\n\nfunction destroy() {\n  if (authDialog && authDialog.parentNode) {\n    authDialog.parentNode.removeChild(authDialog);\n  }\n  authDialog = null;\n  if (pricingDialog && pricingDialog.parentNode) {\n    pricingDialog.parentNode.removeChild(pricingDialog);\n  }\n  pricingDialog = null;\n}\n\nfunction setZIndex(z: number) {\n  zIndex = z;\n  if (authDialog) {\n    authDialog.style.zIndex = zIndex.toString();\n  }\n  if (pricingDialog) {\n    pricingDialog.style.zIndex = zIndex.toString();\n  }\n}\n\neventBus.on('login_success', () => {\n  if (!pricingAfterLogin) return;\n  const options = pricingAfterLogin;\n  pricingAfterLogin = null;\n  getPricingDialog().open(options);\n});\n\n/**\n * VidauSSO — SDK 单例对象\n */\nconst VidauSSO = {\n  /**\n   * 初始化 SDK\n   * @param config 配置项\n   */\n  init(config: VidauSSOConfig): void {\n    if (getInitialized()) {\n      console.warn('[VidauSSO] SDK already initialized');\n      return;\n    }\n\n    getAffiliateCode();\n\n    // 保存用户配置\n    setUserConfig(config);\n\n    // 初始化环境配置\n    initConfig(config.env, {\n      ...(config.apiBaseUrl ? { apiBaseUrl: config.apiBaseUrl } : {}),\n      ...(config.cookieDomain ? { cookieDomain: config.cookieDomain } : {}),\n    });\n\n    // Debug 模式\n    if (config.debug) {\n      setDebugMode(true);\n    }\n\n    // Modal z-index\n    if (config.zIndex) {\n      setZIndex(config.zIndex);\n    }\n\n    // 注册事件回调\n    if (config.onLoginSuccess) {\n      eventBus.on('login_success', config.onLoginSuccess as SSOEventHandler);\n    }\n    if (config.onLogout) {\n      eventBus.on('logout', config.onLogout as SSOEventHandler);\n    }\n    if (config.onAuthChange) {\n      eventBus.on('auth_change', config.onAuthChange as SSOEventHandler);\n    }\n\n    setInitialized(true);\n    initAnalytics();\n    bindPricingHeaderListener();\n    getPricingDialog();\n    unsubscribeSessionSync = subscribeToSessionSync((detail) => {\n      if (detail.source === getSessionSyncSource()\n        || detail.appId !== getUserConfig()?.appId\n        || !getInitialized()) return;\n\n      if (detail.authenticated) {\n        void validateAndFetchUser();\n        return;\n      }\n\n      clearToken();\n      eventBus.emit('logout');\n      eventBus.emit('auth_change', false, null);\n    });\n    console.log('[VidauSSO] SDK initialized', { appId: config.appId, env: config.env || 'auto' });\n\n    eventBus.on('login_success', () => {\n      trackPricingPageView();\n    });\n\n    // HttpOnly Cookie 不可由 JavaScript 探测，始终通过会话接口恢复状态。\n    void validateAndFetchUser().then(() => {\n      trackPricingPageView();\n    });\n  },\n\n  /**\n   * 弹出登录 Modal\n   */\n  login(): void {\n    if (!getInitialized()) {\n      console.error('[VidauSSO] SDK not initialized. Call VidauSSO.init() first.');\n      return;\n    }\n    open();\n  },\n\n  /**\n   * 弹出注册 Modal\n   */\n  register(): void {\n    if (!getInitialized()) {\n      console.error('[VidauSSO] SDK not initialized. Call VidauSSO.init() first.');\n      return;\n    }\n    getAuthDialog().open('register');\n  },\n\n  /**\n   * 打开 Pricing 弹窗。未登录用户会先完成 SSO 登录，随后自动回到弹窗。\n   * 支付成功、失败与关闭回调均通过 options 和 on() 事件提供给调用方。\n   */\n  openPricing(options: PricingDialogOptions = {}): void {\n    if (!getInitialized()) {\n      console.error('[VidauSSO] SDK not initialized. Call VidauSSO.init() first.');\n      return;\n    }\n    if (!_isLoggedIn()) {\n      pricingAfterLogin = options;\n      open();\n      return;\n    }\n    getPricingDialog().open(options);\n  },\n\n  /** 关闭 Pricing 弹窗。 */\n  closePricing(): void {\n    pricingDialog?.close();\n  },\n\n  /**\n   * 关闭登录 Modal\n   */\n  closeModal(): void {\n    close();\n  },\n\n  /**\n   * 退出登录\n   */\n  async logout(): Promise<void> {\n    await _logout();\n  },\n\n  /**\n   * 获取当前已恢复的 SSO Token。初始化后的会话恢复完成前可能返回 null。\n   */\n  getToken(): string | null {\n    return _getToken();\n  },\n\n  /**\n   * 检查是否已登录\n   */\n  isLoggedIn(): boolean {\n    return _isLoggedIn();\n  },\n\n  /**\n   * 获取当前用户信息\n   */\n  getUser(): VidauUser | null {\n    return _getUser();\n  },\n\n  /**\n   * 异步获取并验证用户信息\n   */\n  async fetchUser(): Promise<VidauUser | null> {\n    return validateAndFetchUser();\n  },\n\n  /**\n   * 监听事件\n   * @param event 事件类型\n   * @param handler 处理函数\n   * @returns 取消订阅函数\n   */\n  on(event: SSOEventType, handler: SSOEventHandler): () => void {\n    return eventBus.on(event, handler);\n  },\n\n  /**\n   * 销毁 SDK 实例\n   */\n  destroy(): void {\n    destroy();\n    unsubscribeSessionSync?.();\n    unsubscribeSessionSync = null;\n    eventBus.clear();\n    resetAnalyticsBindings();\n    setInitialized(false);\n  },\n};\n\n// 同时支持 `import VidauSSO` 与 `import { VidauSSO }`\nexport { VidauSSO };\nexport default VidauSSO;\n\n// 对于 UMD 浏览器环境，挂载到全局\nif (typeof window !== 'undefined') {\n  (window as any).VidauSSO = VidauSSO;\n}\n\n// 类型导出\nexport type {\n  PricingCloseReason,\n  PricingDialogOptions,\n  PricingPaymentResult,\n  VidauSSOConfig,\n  VidauUser,\n  SSOEventType,\n  SSOEventHandler,\n} from './types';\n"],"names":["STORAGE_KEY","MAX_AGE_MS","remembered","normalizeAffiliateCode","value","code","getAffiliateCode","now","params","incoming","host","domain","d","cookie","part","stored","ENV_CONFIGS","initialScriptSrc","detectEnv","currentEnv","configOverrides","initConfig","env","overrides","getConfig","getEnv","deleteCookie","name","getDevice","ua","parseJwtUserId","token","normalized","json","BI_RM","int2char","op_and","x","y","op_or","op_xor","op_andnot","lbit","r","cbit","b64map","b64pad","hex2b64","h","i","c","ret","b64tohex","s","k","slop","v","decoder","Hex","a","hex","ignore","out","bits","char_count","Base64","b64","m","max","Int10","b","l","t","base","ellipsis","reTimeS","reTimeL","stringCut","str","len","Stream","enc","pos","start","end","raw","hi","lo","shortYear","neg","pad","n","maxLength","unusedBit","lenBit","intro","skip","j","ASN1","stream","header","length","tag","sub","ASN1Tag","content","indent","buf","hexString","offset","streamStart","getSub","e","dbits","canary","j_lm","lowprimes","lplim","BigInteger","km","p","nbi","nbits","z","Classic","Montgomery","q","nbv","Barrett","g","k1","g2","w","is1","r2","ac","u","NullExp","mi","sh","intAt","bs","cbs","bm","ds","pm","pt","ts","ms","nsh","ys","y0","yt","d1","d2","qd","cs","op","f","n1","callback","gcda1","bnp_1","bnpfn1_1","u0","parseBigInt","inBrowser","xl","xh","BI_FP","BI_RC","rr","vv","Arcfour","key","prng_newstate","rng_psize","rng_state","rng_pool","rng_pptr","count","onMouseMoveListener_1","ev","mouseCoordinates","rng_get_byte","random","SecureRandom","ba","rstr_sha256","binb2rstr","binb_sha256","rstr2binb","rstr2hex","input","hex_tab","output","sha256_S","X","sha256_R","sha256_Ch","sha256_Maj","sha256_Sigma0256","sha256_Sigma1256","sha256_Gamma0256","sha256_Gamma1256","sha256_K","HASH","W","T1","T2","safe_add","lsw","msw","pkcs1pad1","filler","pkcs1pad2","rng","oaep_mgf1_arr","seed","hashFunc","mask","SHA256_SIZE","oaep_pad","hashLen","PS","DB","dbMask","maskedDB","seedMask","maskedSeed","RSAKey","xp","xq","N","E","text","paddingFunction","D","P","Q","DP","DQ","C","B","qs","ee","p1","q1","phi","ctext","pkcs1unpad2","rsa","loop1","loop4","loop3","loop2","digestMethod","digestName","getDigestHeader","digest","signature","unpadded","removeDigestHeader","DIGEST_HEADERS","name_1","extendClass","subc","superc","F","KJUR","bigIntegerValue","hPos","xorLen","hMask","biMask","biNeg","dataHex","pemHeader","param","_KJUR","_KJUR_asn1","_DERBoolean","_DERInteger","_DERBitString","_DEROctetString","_DERNull","_DERObjectIdentifier","_DEREnumerated","_DERUTF8String","_DERNumericString","_DERPrintableString","_DERTeletexString","_DERIA5String","_DERUTCTime","_DERGeneralizedTime","_DERSequence","_DERSet","_DERTaggedObject","_newObject","keys","paramList","asn1Obj","tagParam","obj","newParam","i01","i0","i1","binbuf","bin","bi","oidString","itox","roidtox","roid","padLen","bPad","b8","hV","hN","hNlen","head","newS","newHexString","utcDate","dateObject","type","withMillis","year","month","day","hour","min","sec","millis","sMillis","asn1ObjectArray","asn1Object","intValue","o","newHexStringIncludingUnusedBits","unusedBits","hValue","hUnusedBits","binaryString","booleanArray","nLength","oidName","oid","isExplicitFlag","tagNoHex","__extends","extendStatics","__","JSEncryptRSAKey","_super","_this","pem","modulus","public_exponent","reHex","der","asn1","private_exponent","prime1","prime2","exponent1","exponent2","coefficient","bit_string","sequence","options","seq","first_sequence","second_sequence","width","regex","_a","version","JSEncrypt","privkey","pubkey","cb","PUBLIC_KEY","encryptPassword","password","encryptor","encrypted","normalizeOAuthRedirectUrl","redirectUrl","suffixIndex","suffix","EventBus","event","handler","args","handlers","eventBus","SESSION_SYNC_EVENT","sessionSyncSource","getSessionSyncSource","broadcastSessionChange","appId","authenticated","subscribeToSessionSync","listener","detail","currentUser","currentToken","isInitialized","userConfig","authRevision","inflightUserInfo","lastUserInfoAt","USER_INFO_TTL_MS","setUserConfig","config","getUserConfig","getToken","saveToken","clearToken","isLoggedIn","getUser","validateAndFetchUser","revision","res","api.getUserInfo","handleLoginSuccess","user","userId","logout","api.logout","getInitialized","setInitialized","debugMode","setDebugMode","debug","log","THIRD_PARTY_LOGIN_ENDPOINTS","getRedirectUrl","request","endpoint","body","headers","url","aff","requestBody","data","NEED_LOGIN_VERIFY","isNeedLoginVerify","loginByEmail","email","sendVerificationCode","registerByCode","resetPassword","googleLogin","credential","googleOneTapLogin","facebookLogin","accessToken","userID","userInfo","appleLogin","identityToken","microsoftLogin","idToken","getUserInfo","getPricing","getCoinPackages","getIpLocation","createSubscriptionOrder","payload","createCoinOrder","getPaymentStatus","paymentId","writeActivity","PAGE_VIEW_KEY","isPricingPagePath","pathname","writePricingDialogView","source","trackPricingPageView","GOOGLE_TAG_ID","GA_CLIENT_ID_COOKIE","GA_CLIENT_ID_DOMAIN","METHOD_CLICK_DEDUPE_MS","GTAG_SCRIPT_ID","cachedClientId","gtagLoadStarted","identityListenersBound","lastMethodClick","currentHostname","isProductionGaHost","hostname","canSendProductionGa","apiBaseUrl","isOfficialMarketingHost","isEmbeddedInIframe","shouldSendOwnedModalViews","inIframe","readCookie","prefix","match","writeCookie","secure","parseGaClientId","parts","readGaClientId","fromGa","persistGaClientId","clientId","clientIdParams","triggerPageParams","getGtag","requestGtagClientId","gtag","hostHasGtagScript","ensureGtagLoaded","win","hostScriptReady","script","sendGaEvent","eventName","initAnalytics","bindIdentityListeners","bindGaUser","id","trackSignupModalView","mode","trackPayModalView","trackSignupMethodClick","method","pageParams","gaSent","resetAnalyticsBindings","HTML_ENTITIES","escapeHtml","char","safeUrl","allowRelative","DEFAULT_BANNER_DURATION_SECONDS","MIN_BANNER_DURATION_SECONDS","MAX_BANNER_DURATION_SECONDS","DEFAULT_BANNER_PATH","DEFAULT_PRIVACY_URL","DEFAULT_TERMS_URL","RESEND_CODE_COOLDOWN_SECONDS","TAG_ICON_SVGS","VidauAuthDialog","banner","seconds","banners","index","error","idleWindow","video","button","mount","durationMs","slot","fallbackUrl","image","iconName","template","title","description","tags","item","icon","step","stepIndex","provider","isVerificationView","disabled","submitLabel","emailField","passwordField","verificationCodeFields","_","resendButtonLabel","resendButton","fields","bannerDurationMs","loading","steps","fallbackLabel","label","providers","labels","attempt","google","response","_b","fire","onWindowBlur","active","isLogin","isProviderChoice","showProviderChoice","showLoginEmailProviders","showEmailForm","viewCopy","switchRow","privacyPolicy","termsOfUse","legal","signupOffer","html","backdrop","closeBtn","backNav","tabLogin","tabRegister","form","verificationInputs","getVerificationCode","btnGoogle","btnApple","btnMicrosoft","btnFacebook","btnEmail","resendCodeBtn","passwordInput","passwordToggle","passwordEyeHidden","passwordEyeVisible","passwordHasSpecialCharacter","show","submit","updateSubmitState","hasRequiredLength","hasSpecialCharacter","registrationPasswordIsValid","verificationCodeIsValid","fillVerificationDigits","startIndex","digits","digit","clipboardData","_c","_d","_e","_f","resendMode","resendType","api.sendVerificationCode","currentMode","validateEmail","validation","api.loginByEmail","api.isNeedLoginVerify","sendRes","api.registerByCode","api.resetPassword","_g","api.googleOneTapLogin","api.googleLogin","FB","authResponse","api.facebookLogin","AppleID","api.appleLogin","err","msal","msalConfig","msalInstance","loginResponse","api.microsoftLogin","closeIcon","_documentCurrentScript","starsIcon","checkIcon","diamondIcon","coinsIcon","coinsMutedIcon","chevronIcon","PAYMENT_POLL_INTERVAL","PAYMENT_POLL_LIMIT","CUSTOM_DAILY_VIP_LEVEL","PRICE_LEVEL","BUSINESS_LEVELS","toNumber","number","formatNumber","formatPrice","formatDiscount","formatUnitPrice","price","credits","unit","planKind","plan","levels","setting","level","userVipLevel","userType","isPaidUser","planVipLevel","kind","isCustomUser","canPurchasePlan","isBusinessSetting","parseApiRights","rights","right","trimmed","row","creditEquivalents","coinPackagesFrom","record","nested","VidauPricingDialog","reason","knownPaid","userRefresh","pricingResult","ipResult","coinResult","viewBeforeUser","coins","alipayAvailable","channel","option","tierCount","maxIndex","settings","businessTiers","selectedSetting","apiRights","vipLevel","outerPrices","targetPeriod","allPrices","outer","items","period","scroller","section","target","isCredits","toolbar","onScroll","stuck","next","src","size","plans","businessTierCount","symbol","discount","hasDiscount","isDailyCustom","billed","creditLabel","billingNote","atOrBelow","isCurrent","canBuy","cta","equivalents","hasTiers","line","tier","feature","coin","paid","annual","styles","_h","_i","_j","_k","fallback","popup","created","purchaseType","payment","check","status","pending","result","message","authDialog","pricingDialog","zIndex","unsubscribeSessionSync","pricingAfterLogin","pricingHeaderListenerBound","bindPricingHeaderListener","VidauSSO","getAuthDialog","getPricingDialog","open","close","destroy","setZIndex","_isLoggedIn","_logout","_getToken","_getUser"],"mappings":"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kC,GAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16]}