@fast-china/utils 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/Fast.png +0 -0
  3. package/README.md +27 -29
  4. package/README.zh.md +27 -29
  5. package/dist/base64/index.mjs.map +1 -1
  6. package/dist/crypto/index.d.mts +265 -96
  7. package/dist/crypto/index.mjs +563 -261
  8. package/dist/crypto/index.mjs.map +1 -1
  9. package/dist/identity/index.d.mts +5 -5
  10. package/dist/identity/index.mjs +2 -2
  11. package/dist/identity/index.mjs.map +1 -1
  12. package/dist/index.d.mts +3 -3
  13. package/dist/index.global.min.js +3 -0
  14. package/dist/index.global.min.js.map +1 -0
  15. package/dist/index.mjs +2 -2
  16. package/dist/storage/index.d.mts +11 -8
  17. package/dist/storage/index.mjs +21 -18
  18. package/dist/storage/index.mjs.map +1 -1
  19. package/dist/vue/emits.mjs.map +1 -1
  20. package/dist/vue/index.d.mts +2 -2
  21. package/dist/vue/install.d.mts +11 -29
  22. package/dist/vue/install.mjs +25 -25
  23. package/dist/vue/install.mjs.map +1 -1
  24. package/dist/vue/props.mjs.map +1 -1
  25. package/dist/vue/render.d.mts +2 -3
  26. package/dist/vue/render.mjs +3 -9
  27. package/dist/vue/render.mjs.map +1 -1
  28. package/docs/API.md +30 -14
  29. package/docs/API.zh-CN.md +30 -14
  30. package/docs/DEVELOPMENT_RELEASE.zh-CN.md +4 -4
  31. package/docs/RUNTIME_CONTRACT.md +10 -10
  32. package/package.json +9 -11
  33. package/dist/array/index.d.mts.map +0 -1
  34. package/dist/async/index.d.mts.map +0 -1
  35. package/dist/base64/index.d.mts.map +0 -1
  36. package/dist/color/index.d.mts.map +0 -1
  37. package/dist/crypto/index.d.mts.map +0 -1
  38. package/dist/date/index.d.mts.map +0 -1
  39. package/dist/dom/style.d.mts.map +0 -1
  40. package/dist/env/index.d.mts.map +0 -1
  41. package/dist/identity/index.d.mts.map +0 -1
  42. package/dist/logger/index.d.mts.map +0 -1
  43. package/dist/number/index.d.mts.map +0 -1
  44. package/dist/object/index.d.mts.map +0 -1
  45. package/dist/storage/index.d.mts.map +0 -1
  46. package/dist/string/index.d.mts.map +0 -1
  47. package/dist/vue/emits.d.mts.map +0 -1
  48. package/dist/vue/expose.d.mts.map +0 -1
  49. package/dist/vue/func.d.mts.map +0 -1
  50. package/dist/vue/install.d.mts.map +0 -1
  51. package/dist/vue/props.d.mts.map +0 -1
  52. package/dist/vue/render.d.mts.map +0 -1
  53. package/dist/vue/slots.d.mts.map +0 -1
  54. package/dist/vue/with.d.mts.map +0 -1
  55. package/src/array/index.ts +0 -173
  56. package/src/async/index.ts +0 -475
  57. package/src/base64/index.ts +0 -374
  58. package/src/color/index.ts +0 -208
  59. package/src/crypto/index.ts +0 -670
  60. package/src/date/index.ts +0 -451
  61. package/src/dom/index.ts +0 -6
  62. package/src/dom/style.ts +0 -92
  63. package/src/env/index.ts +0 -169
  64. package/src/identity/index.ts +0 -144
  65. package/src/index.ts +0 -20
  66. package/src/internal/text.ts +0 -46
  67. package/src/logger/index.ts +0 -219
  68. package/src/number/index.ts +0 -235
  69. package/src/object/index.ts +0 -160
  70. package/src/storage/index.ts +0 -524
  71. package/src/string/index.ts +0 -328
  72. package/src/vue/emits.ts +0 -71
  73. package/src/vue/expose.ts +0 -11
  74. package/src/vue/func.ts +0 -17
  75. package/src/vue/index.ts +0 -13
  76. package/src/vue/install.ts +0 -185
  77. package/src/vue/props.ts +0 -39
  78. package/src/vue/render.ts +0 -41
  79. package/src/vue/slots.ts +0 -23
  80. package/src/vue/with.ts +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/crypto/index.ts"],"sourcesContent":["import AES from \"crypto-js/aes.js\";\nimport Hex from \"crypto-js/enc-hex.js\";\nimport Utf8 from \"crypto-js/enc-utf8.js\";\nimport MD5 from \"crypto-js/md5.js\";\nimport ECB from \"crypto-js/mode-ecb.js\";\nimport Pkcs7 from \"crypto-js/pad-pkcs7.js\";\nimport SHA1 from \"crypto-js/sha1.js\";\n\nimport { decodeBase64Bytes, decodeBase64UrlBytes, encodeBase64Bytes, encodeBase64UrlBytes } from \"../base64/index.js\";\nimport { encodeUtf8, getTextDecoder } from \"../internal/text.js\";\n\nimport type CryptoJS from \"crypto-js\";\n\n/** 密码加密协议固定边界;修改任一值都需要同步安全评估、测试与文档。 */\nconst defaultPbkdf2Iterations = 600_000;\nconst minimumPbkdf2Iterations = 100_000;\nconst maximumPbkdf2Iterations = 5_000_000;\nconst maximumPasswordBytes = 1024;\nconst maximumPlaintextBytes = 8 * 1024 * 1024;\nconst maximumPayloadLength = 16 * 1024 * 1024;\nconst encryptedPayloadPrefix = \"FAST-AES-256-GCM-V2\";\n\n/** 用于逐项验证实际依赖能力,而不是只判断 `subtle` 对象是否存在。 */\ntype RuntimeSubtleCrypto = Partial<\n\tPick<SubtleCrypto, \"decrypt\" | \"deriveBits\" | \"deriveKey\" | \"digest\" | \"encrypt\" | \"exportKey\" | \"generateKey\" | \"importKey\" | \"sign\" | \"verify\">\n>;\n/** Web Crypto 的运行时最小结构,避免用不安全的类型断言掩盖能力缺失。 */\ninterface RuntimeCrypto extends Partial<Pick<Crypto, \"getRandomValues\">> {\n\t/** 可选 SubtleCrypto 能力;密码原语入口会继续逐项验证所需方法。 */\n\tsubtle?: RuntimeSubtleCrypto;\n}\n\n/** Crypto 工具延迟读取的平台全局对象最小视图。 */\ninterface RuntimeCryptoGlobals {\n\t/** 可选 Web Crypto 实现;具体方法仍由每个能力入口逐项校验。 */\n\tcrypto?: RuntimeCrypto;\n}\n\nconst runtimeCryptoGlobals = globalThis as unknown as RuntimeCryptoGlobals;\n\n/** 可直接哈希或比较的二进制输入。 */\nexport type TextOrBytes = string | Uint8Array;\n\n/** {@link encryptTextWithPassword} 的密钥派生选项。 */\nexport interface PasswordEncryptionOptions {\n\t/**\n\t * PBKDF2-HMAC-SHA-256 迭代次数,默认 `600_000`,允许 100,000 至 5,000,000。\n\t * 低于默认值需要调用方基于目标硬件完成明确的安全与性能评估。\n\t */\n\titerations?: number;\n}\n\n/** CryptoJS 兼容 AES 模式。 */\nexport type LegacyAesCipherMode = \"CBC\" | \"ECB\";\n\n/** Web Crypto 导出的 PEM 公私钥对。 */\nexport interface PemKeyPair {\n\t/** 未加密的 PKCS#8 PEM 私钥,包含标准 `PRIVATE KEY` 头尾和 64 字符换行。 */\n\tprivateKey: string;\n\t/** SubjectPublicKeyInfo PEM 公钥,包含标准 `PUBLIC KEY` 头尾和 64 字符换行。 */\n\tpublicKey: string;\n}\n\n/** RSA-OAEP 密钥生成选项。 */\nexport interface RsaKeyPairOptions {\n\t/** RSA 模数位数,默认 2048;必须是不小于 2048 的 256 倍数。 */\n\tmodulusLength?: number;\n}\n\n/** 本模块支持的 Web Crypto 椭圆曲线。 */\nexport type EcNamedCurve = \"P-256\" | \"P-384\" | \"P-521\";\n\n/**\n * 获取安全随机数能力。\n *\n * @remarks 随机字节和随机字符串不依赖 SubtleCrypto,因此这里与完整密码原语检查分开。\n * @returns 当前平台的 Crypto 对象。\n * @throws `Error` 当平台缺少 `getRandomValues`。\n */\nconst requireRandomCrypto = (): Crypto => {\n\tconst crypto = runtimeCryptoGlobals.crypto;\n\tif (typeof crypto?.getRandomValues !== \"function\") {\n\t\tthrow new Error(\"Web Crypto is unavailable in the current runtime.\");\n\t}\n\treturn crypto as Crypto;\n};\n\n/**\n * 获取本模块非随机 API 所需的完整 Web Crypto 能力。\n *\n * @returns 已确认实现摘要、派生、密钥导入导出、加解密、签名和验证方法的 Crypto 对象。\n * @throws `Error` 当任一必要 SubtleCrypto 方法缺失。\n */\nconst requireWebCrypto = (): Crypto => {\n\tconst crypto = requireRandomCrypto();\n\tconst subtle = (crypto as unknown as RuntimeCrypto).subtle;\n\tif (\n\t\ttypeof subtle?.decrypt !== \"function\" ||\n\t\ttypeof subtle.deriveBits !== \"function\" ||\n\t\ttypeof subtle.deriveKey !== \"function\" ||\n\t\ttypeof subtle.digest !== \"function\" ||\n\t\ttypeof subtle.encrypt !== \"function\" ||\n\t\ttypeof subtle.exportKey !== \"function\" ||\n\t\ttypeof subtle.generateKey !== \"function\" ||\n\t\ttypeof subtle.importKey !== \"function\" ||\n\t\ttypeof subtle.sign !== \"function\" ||\n\t\ttypeof subtle.verify !== \"function\"\n\t) {\n\t\tthrow new Error(\"Web Crypto SubtleCrypto is unavailable in the current runtime.\");\n\t}\n\treturn crypto;\n};\n\n/**\n * 把二进制联合输入规范为字节。\n *\n * @param value - UTF-8 文本或现有字节数组。\n * @returns 文本的新编码结果,或原始字节数组引用。\n */\nconst toInputBytes = (value: TextOrBytes): Uint8Array => (typeof value === \"string\" ? encodeUtf8(value) : value);\n\n/**\n * 把 Uint8Array 复制为独立的完整 ArrayBuffer。\n *\n * @remarks 不能直接返回 `bytes.buffer`,因为输入可能只是更大 Buffer 的切片。\n * @param bytes - 源字节视图。\n * @returns 长度与视图完全一致、偏移为零的新 ArrayBuffer。\n */\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n\tconst copy = new Uint8Array(bytes.byteLength);\n\tcopy.set(bytes);\n\treturn copy.buffer;\n};\n\n/** 本模块导出的 PKCS#8 与 SPKI PEM 标签。 */\nconst pemLabels = {\n\tprivate: \"PRIVATE KEY\",\n\tpublic: \"PUBLIC KEY\",\n} as const;\n\n/**\n * 把 DER 内容封装为 PEM。\n *\n * @param label - PEM Begin/End 标签,不包含分隔线。\n * @param value - DER 二进制内容。\n * @returns 每行最多 64 个 Base64 字符的 PEM 文本。\n */\nconst toPem = (label: string, value: ArrayBuffer): string => {\n\tconst encoded = encodeBase64Bytes(new Uint8Array(value));\n\tconst lines = encoded.match(/.{1,64}/gu)?.join(\"\\n\") ?? \"\";\n\treturn `-----BEGIN ${label}-----\\n${lines}\\n-----END ${label}-----`;\n};\n\n/**\n * 校验 PEM 标签并还原 DER。\n *\n * @param value - PEM 文本。\n * @param label - 当前算法预期的标签。\n * @returns 独立的 DER ArrayBuffer。\n * @throws `TypeError` 当 Begin/End 标签不匹配或 Base64 内容非法。\n */\nconst fromPem = (value: string, label: string): ArrayBuffer => {\n\tconst header = `-----BEGIN ${label}-----`;\n\tconst footer = `-----END ${label}-----`;\n\tconst trimmed = value.trim();\n\tif (!trimmed.startsWith(header) || !trimmed.endsWith(footer)) throw new TypeError(`Expected a ${label} PEM value.`);\n\tconst encoded = trimmed.slice(header.length, -footer.length).replace(/\\s+/gu, \"\");\n\treturn toArrayBuffer(decodeBase64Bytes(encoded));\n};\n\n/**\n * 导出 Web Crypto 密钥对。\n *\n * @param keyPair - 可导出的公私钥对。\n * @returns PKCS#8 私钥和 SPKI 公钥组成的 PEM 对象。\n * @throws `Error` 当平台拒绝导出或密钥格式不兼容。\n */\nconst exportKeyPair = async (keyPair: CryptoKeyPair): Promise<PemKeyPair> => {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.exportKey(\"pkcs8\", keyPair.privateKey),\n\t\tcrypto.subtle.exportKey(\"spki\", keyPair.publicKey),\n\t]);\n\treturn {\n\t\tprivateKey: toPem(pemLabels.private, privateKey),\n\t\tpublicKey: toPem(pemLabels.public, publicKey),\n\t};\n};\n\n/**\n * 缩小 Web Crypto `generateKey` 的联合返回值。\n *\n * @param value - 平台返回的单密钥或密钥对。\n * @returns 同时具有公钥和私钥的密钥对。\n * @throws `Error` 当平台没有按请求生成密钥对。\n */\nconst assertKeyPair = (value: CryptoKey | CryptoKeyPair): CryptoKeyPair => {\n\tif (\"privateKey\" in value && \"publicKey\" in value) return value;\n\tthrow new Error(\"The runtime did not generate a key pair.\");\n};\n\n/**\n * 按旧协议规范化 AES Key。\n *\n * @param key - 任意长度 UTF-8 文本 Key。\n * @returns 补字符 `f` 或截断到 32 个 UTF-16 Code Unit 后的 CryptoJS WordArray。\n */\nconst normalizeAesKey = (key: string): CryptoJS.lib.WordArray => Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n/**\n * 按旧协议规范化 AES IV。\n *\n * @param vector - 任意长度 UTF-8 文本 IV。\n * @returns 补字符 `f` 或截断到 16 个 UTF-16 Code Unit 后的 CryptoJS WordArray。\n */\nconst normalizeAesVector = (vector: string): CryptoJS.lib.WordArray => Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\n/**\n * 选择与 ECDSA 曲线对应的摘要算法。\n *\n * @param namedCurve - 本模块支持的 NIST 曲线。\n * @returns P-256、P-384、P-521 分别对应 SHA-256、SHA-384、SHA-512。\n */\nconst getEcdsaHash = (namedCurve: EcNamedCurve): \"SHA-256\" | \"SHA-384\" | \"SHA-512\" => {\n\tswitch (namedCurve) {\n\t\tcase \"P-256\":\n\t\t\treturn \"SHA-256\";\n\t\tcase \"P-384\":\n\t\t\treturn \"SHA-384\";\n\t\tcase \"P-521\":\n\t\t\treturn \"SHA-512\";\n\t}\n};\n\n/**\n * 获取 ECDH 共享秘密的导出位数。\n *\n * @param namedCurve - 本模块支持的 NIST 曲线。\n * @returns 曲线字段按完整字节对齐后的位数;P-521 返回 528。\n */\nconst getEcBitLength = (namedCurve: EcNamedCurve): number => {\n\tswitch (namedCurve) {\n\t\tcase \"P-256\":\n\t\t\treturn 256;\n\t\tcase \"P-384\":\n\t\t\treturn 384;\n\t\tcase \"P-521\":\n\t\t\treturn 528;\n\t}\n};\n\n/**\n * 校验并编码密码。\n *\n * @param password - 用户提供的密码文本。\n * @returns UTF-8 密码字节。\n * @throws `TypeError` 当密码为空。\n * @throws `RangeError` 当 UTF-8 长度超过 1,024 字节。\n */\nconst encodeValidatedPassword = (password: string): Uint8Array => {\n\tconst bytes = encodeUtf8(password);\n\tif (bytes.length === 0) throw new TypeError(\"The encryption password cannot be empty.\");\n\tif (bytes.length > maximumPasswordBytes) {\n\t\tthrow new RangeError(`The UTF-8 password cannot exceed ${maximumPasswordBytes} bytes.`);\n\t}\n\treturn bytes;\n};\n\n/**\n * 校验 PBKDF2 迭代次数。\n *\n * @param iterations - 待使用的迭代次数。\n * @returns 校验后的原始整数。\n * @throws `RangeError` 当值不是 100,000 至 5,000,000 的安全整数。\n */\nconst validateIterations = (iterations: number): number => {\n\tif (!Number.isSafeInteger(iterations) || iterations < minimumPbkdf2Iterations || iterations > maximumPbkdf2Iterations) {\n\t\tthrow new RangeError(`iterations must be a safe integer between ${minimumPbkdf2Iterations} and ${maximumPbkdf2Iterations}.`);\n\t}\n\treturn iterations;\n};\n\n/**\n * 从密码派生 AES-256-GCM Key。\n *\n * @param passwordBytes - 已校验的 UTF-8 密码。\n * @param salt - 载荷中保存的 16 字节随机盐。\n * @param iterations - 已校验 PBKDF2 成本。\n * @param usage - 派生 Key 唯一允许的加密或解密用途。\n * @returns 不可导出的 AES-GCM CryptoKey。\n * @throws `Error` 当平台缺少相应 Web Crypto 能力或拒绝派生。\n */\nconst derivePasswordEncryptionKey = async (\n\tpasswordBytes: Uint8Array,\n\tsalt: Uint8Array,\n\titerations: number,\n\tusage: \"decrypt\" | \"encrypt\"\n): Promise<CryptoKey> => {\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\treturn crypto.subtle.deriveKey(\n\t\t{ hash: \"SHA-256\", iterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\t{ length: 256, name: \"AES-GCM\" },\n\t\tfalse,\n\t\t[usage]\n\t);\n};\n\n/**\n * 生成安全随机字节。\n *\n * @param length - 0 至 65,536 的安全整数;上限来自 Web Crypto 单次请求限制。\n * @returns 新建的 `Uint8Array`。\n * @throws 参数非法时抛出 `RangeError`;缺少 Web Crypto 时抛出 `Error`。\n */\nexport function generateRandomBytes(length: number): Uint8Array {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > 65_536) {\n\t\tthrow new RangeError(\"length must be a safe integer from 0 through 65,536.\");\n\t}\n\treturn requireRandomCrypto().getRandomValues(new Uint8Array(length));\n}\n\n/**\n * 计算 SHA-256 摘要。\n *\n * @remarks SHA-256 是快速摘要,不适合直接存储或校验密码。\n * @param value - UTF-8 字符串或原始字节。\n * @returns 32 字节摘要。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function sha256Bytes(value: TextOrBytes): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(toInputBytes(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-256 并格式化为十六进制。\n *\n * @param value - UTF-8 字符串或原始字节。\n * @returns 64 字符小写十六进制文本。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function sha256Hex(value: TextOrBytes): Promise<string> {\n\tconst digest = await sha256Bytes(value);\n\treturn Array.from(digest, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * 计算 MD5 摘要并返回小写十六进制文本。\n *\n * @remarks MD5 仅用于历史协议和非安全校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 32 字符小写十六进制摘要。\n */\nexport function md5Hex(value: string): string {\n\treturn MD5(value).toString(Hex);\n}\n\n/**\n * 计算 SHA-1 摘要并返回小写十六进制文本。\n *\n * @remarks SHA-1 仅用于旧系统互通;新用途应使用 {@link sha256Hex}。\n * @param value - UTF-8 文本。\n * @returns 40 字符小写十六进制摘要。\n */\nexport function sha1Hex(value: string): string {\n\treturn SHA1(value).toString(Hex);\n}\n\n/**\n * 使用 AES-256-CBC 与 PKCS#7 填充加密文本。\n *\n * @remarks 密钥按 UTF-8 文本补齐或截断为 32 个字符,IV 补齐或截断为 16 个字符。\n * 该格式不包含认证标签;新数据优先使用 {@link encryptTextWithPassword}。\n * @param plaintext - UTF-8 明文。\n * @param key - 兼容密钥文本。\n * @param vector - 兼容初始化向量文本。\n * @returns CryptoJS Base64 密文。\n */\nexport function encryptLegacyAesCbc(plaintext: string, key: string, vector: string): string {\n\tif (plaintext.length === 0) return \"\";\n\treturn AES.encrypt(plaintext, normalizeAesKey(key), {\n\t\tiv: normalizeAesVector(vector),\n\t\tpadding: Pkcs7,\n\t}).toString();\n}\n\n/** 解密 {@link encryptLegacyAesCbc} 生成的 CryptoJS Base64 密文。 */\nexport function decryptLegacyAesCbc(ciphertext: string, key: string, vector: string): string {\n\tif (ciphertext.length === 0) return \"\";\n\treturn AES.decrypt(ciphertext, normalizeAesKey(key), {\n\t\tiv: normalizeAesVector(vector),\n\t\tpadding: Pkcs7,\n\t}).toString(Utf8);\n}\n\n/**\n * 使用 AES-256-ECB 与 PKCS#7 填充加密文本。\n *\n * @remarks ECB 会暴露重复明文块结构,只能用于必须兼容的旧协议,不得用于新数据设计。\n * @param plaintext - UTF-8 明文。\n * @param key - 兼容密钥文本,补齐或截断为 32 个字符。\n * @returns CryptoJS Base64 密文。\n */\nexport function encryptLegacyAesEcb(plaintext: string, key: string): string {\n\tif (plaintext.length === 0) return \"\";\n\treturn AES.encrypt(plaintext, normalizeAesKey(key), {\n\t\tmode: ECB,\n\t\tpadding: Pkcs7,\n\t}).toString();\n}\n\n/** 解密 {@link encryptLegacyAesEcb} 生成的 CryptoJS Base64 密文。 */\nexport function decryptLegacyAesEcb(ciphertext: string, key: string): string {\n\tif (ciphertext.length === 0) return \"\";\n\treturn AES.decrypt(ciphertext, normalizeAesKey(key), {\n\t\tmode: ECB,\n\t\tpadding: Pkcs7,\n\t}).toString(Utf8);\n}\n\n/** 生成可导出的 RSA-OAEP/SHA-256 PEM 密钥对。 */\nexport async function generateRsaOaepKeyPair(options: RsaKeyPairOptions = {}): Promise<PemKeyPair> {\n\tconst modulusLength = options.modulusLength ?? 2048;\n\tif (!Number.isSafeInteger(modulusLength) || modulusLength < 2048 || modulusLength % 256 !== 0) {\n\t\tthrow new RangeError(\"modulusLength must be a safe integer of at least 2048 and divisible by 256.\");\n\t}\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(\n\t\tawait crypto.subtle.generateKey(\n\t\t\t{\n\t\t\t\thash: \"SHA-256\",\n\t\t\t\tmodulusLength,\n\t\t\t\tname: \"RSA-OAEP\",\n\t\t\t\tpublicExponent: Uint8Array.of(1, 0, 1),\n\t\t\t},\n\t\t\ttrue,\n\t\t\t[\"decrypt\", \"encrypt\"]\n\t\t)\n\t);\n\treturn exportKeyPair(keyPair);\n}\n\n/** 使用 RSA-OAEP/SHA-256 公钥加密 UTF-8 文本,并返回 Base64 密文。 */\nexport async function encryptRsaOaep(plaintext: string, publicKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"encrypt\",\n\t]);\n\tconst ciphertext = await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(encodeUtf8(plaintext)));\n\treturn encodeBase64Bytes(new Uint8Array(ciphertext));\n}\n\n/** 使用 RSA-OAEP/SHA-256 私钥解密 Base64 密文。 */\nexport async function decryptRsaOaep(ciphertext: string, privateKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"decrypt\",\n\t]);\n\tconst plaintext = await crypto.subtle.decrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(decodeBase64Bytes(ciphertext)));\n\treturn getTextDecoder().decode(plaintext);\n}\n\n/** 生成 ECDSA PEM 签名密钥对。 */\nexport async function generateEcdsaKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDSA\", namedCurve }, true, [\"sign\", \"verify\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/** 使用 ECDSA 私钥签名文本或字节,并返回 Base64 签名。 */\nexport async function signEcdsa(value: TextOrBytes, privateKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDSA\", namedCurve }, false, [\"sign\"]);\n\tconst signature = await crypto.subtle.sign({ hash: getEcdsaHash(namedCurve), name: \"ECDSA\" }, key, toArrayBuffer(toInputBytes(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/** 使用 ECDSA 公钥验证 Base64 签名。 */\nexport async function verifyEcdsa(value: TextOrBytes, signature: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDSA\", namedCurve }, false, [\"verify\"]);\n\treturn crypto.subtle.verify(\n\t\t{ hash: getEcdsaHash(namedCurve), name: \"ECDSA\" },\n\t\tkey,\n\t\ttoArrayBuffer(decodeBase64Bytes(signature)),\n\t\ttoArrayBuffer(toInputBytes(value))\n\t);\n}\n\n/** 生成 ECDH PEM 密钥协商密钥对。 */\nexport async function generateEcdhKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDH\", namedCurve }, true, [\"deriveBits\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用本方 ECDH 私钥与对方 ECDH 公钥派生共享秘密。\n *\n * @remarks 返回值仍需经过合适的 KDF 后才能作为对称密钥,不应直接长期存储。\n */\nexport async function deriveEcdhSecret(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDH\", namedCurve }, false, [\"deriveBits\"]),\n\t\tcrypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDH\", namedCurve }, false, []),\n\t]);\n\tconst secret = await crypto.subtle.deriveBits({ name: \"ECDH\", public: publicKey }, privateKey, getEcBitLength(namedCurve));\n\treturn new Uint8Array(secret);\n}\n\n/**\n * 以不提前退出的方式比较两个字节数组。\n *\n * @remarks JavaScript 引擎不保证严格常量时间;该函数只避免显式短路,不能替代服务端\n * 密码学库提供的 timing-safe primitive。长度是否相同仍属于可观察信息。\n * @param left - 第一字节序列。\n * @param right - 第二字节序列。\n * @returns 长度和每个字节均相同时返回 `true`。\n */\nexport function areBytesEqualWithoutEarlyExit(left: Uint8Array, right: Uint8Array): boolean {\n\tconst length = Math.max(left.length, right.length);\n\tlet difference = left.length === right.length ? 0 : 1;\n\t// 不按长度或首个差异提前退出;缺失位置按零参与累计差异。\n\tfor (let index = 0; index < length; index += 1) difference |= (left[index] ?? 0) ^ (right[index] ?? 0);\n\treturn difference === 0;\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 派生密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 每次调用生成独立 16 字节盐与 12 字节 IV。输出是本库 v2 自描述载荷,\n * 不应被拆分、修改或当作跨语言标准格式。密码加密不替代密钥管理;长期高价值数据\n * 应使用平台 KMS 或专门的加密方案。\n * @param plaintext - 原始文本,不进行 JSON 推断;UTF-8 编码后最大 8 MiB。\n * @param password - 1 至 1024 UTF-8 字节的秘密口令。\n * @param options - PBKDF2 工作因子。\n * @returns 认证密文字符串;相同输入每次产生不同结果。\n * @throws 口令非法时抛出 `TypeError` 或 `RangeError`;明文过大时抛出 `RangeError`;\n * 运行时缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function encryptTextWithPassword(plaintext: string, password: string, options: PasswordEncryptionOptions = {}): Promise<string> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tconst plaintextBytes = encodeUtf8(plaintext);\n\tif (plaintextBytes.length > maximumPlaintextBytes) {\n\t\tthrow new RangeError(`The UTF-8 plaintext cannot exceed ${maximumPlaintextBytes} bytes.`);\n\t}\n\tconst iterations = validateIterations(options.iterations ?? defaultPbkdf2Iterations);\n\tconst crypto = requireWebCrypto();\n\tconst salt = generateRandomBytes(16);\n\tconst iv = generateRandomBytes(12);\n\tconst key = await derivePasswordEncryptionKey(passwordBytes, salt, iterations, \"encrypt\");\n\t// Prefix 同时作为明文版本字段和 AAD,攻击者无法在不破坏认证标签的情况下替换协议版本。\n\tconst ciphertext = await crypto.subtle.encrypt(\n\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\tkey,\n\t\tplaintextBytes\n\t);\n\t// 字段顺序属于持久化协议:版本、KDF 成本、盐、IV、带 GCM Tag 的密文。\n\treturn [\n\t\tencryptedPayloadPrefix,\n\t\tString(iterations),\n\t\tencodeBase64UrlBytes(salt),\n\t\tencodeBase64UrlBytes(iv),\n\t\tencodeBase64UrlBytes(new Uint8Array(ciphertext)),\n\t].join(\":\");\n}\n\n/**\n * 解密 {@link encryptTextWithPassword} 生成的 v2 认证载荷。\n *\n * @param payload - 未修改的 v2 载荷,最大约 16 MiB 文本。\n * @param password - 加密时使用的口令。\n * @returns 原始 UTF-8 文本。\n * @throws 格式或字段非法时抛出 `TypeError`,载荷过大时抛出 `RangeError`,认证或密码\n * 失败及缺少平台能力时抛出 `Error`。\n */\nexport async function decryptTextWithPassword(payload: string, password: string): Promise<string> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (payload.length > maximumPayloadLength) {\n\t\tthrow new RangeError(\"The encrypted payload exceeds the supported size.\");\n\t}\n\t// 先验证固定字段数和版本,再对高成本 KDF 与解密进行任何工作。\n\tconst parts = payload.split(\":\");\n\tif (parts.length !== 5 || parts[0] !== encryptedPayloadPrefix) {\n\t\tthrow new TypeError(\"The encrypted payload format is not supported.\");\n\t}\n\n\tlet iterations: number;\n\tlet salt: Uint8Array;\n\tlet iv: Uint8Array;\n\tlet ciphertext: Uint8Array;\n\ttry {\n\t\titerations = validateIterations(Number(parts[1]));\n\t\tsalt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tiv = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tciphertext = decodeBase64UrlBytes(parts[4] ?? \"\");\n\t\tif (salt.length !== 16 || iv.length !== 12 || ciphertext.length < 16) {\n\t\t\tthrow new TypeError(\"The encrypted payload has invalid field lengths.\");\n\t\t}\n\t} catch (cause) {\n\t\tthrow new TypeError(\"The encrypted payload contains invalid fields.\", { cause });\n\t}\n\n\tconst crypto = requireWebCrypto();\n\tconst textDecoder = getTextDecoder();\n\ttry {\n\t\tconst key = await derivePasswordEncryptionKey(passwordBytes, salt, iterations, \"decrypt\");\n\t\tconst plaintext = await crypto.subtle.decrypt(\n\t\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\t\tkey,\n\t\t\ttoArrayBuffer(ciphertext)\n\t\t);\n\t\treturn textDecoder.decode(plaintext);\n\t} catch (cause) {\n\t\tthrow new Error(\"The payload could not be authenticated or decrypted.\", { cause });\n\t}\n}\n\n/**\n * 规范化历史 AES 模式参数。\n *\n * @param cipherMode - 公共 API 接收的未知模式值。\n * @returns 省略值和 `CBC` 返回 `CBC`,`ECB` 保持原值。\n * @throws `RangeError` 当值不是公开协议允许的字符串。\n */\nconst resolveLegacyAesMode = (cipherMode: unknown): LegacyAesCipherMode => {\n\tif (cipherMode === undefined || cipherMode === \"CBC\") return \"CBC\";\n\tif (cipherMode === \"ECB\") return \"ECB\";\n\tthrow new RangeError('cipherMode must be \"CBC\" or \"ECB\".');\n};\n\n/** 解密历史 AES-CBC/ECB 字符串,并优先解析 JSON 结果。 */\nexport function decryptLegacyAesValue<Result = string>(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode?: LegacyAesCipherMode\n): Result | null {\n\tif (dataStr.length === 0) return null;\n\ttry {\n\t\tconst mode = resolveLegacyAesMode(cipherMode);\n\t\tconst plaintext = mode === \"ECB\" ? decryptLegacyAesEcb(dataStr, key) : decryptLegacyAesCbc(dataStr, key, vector);\n\t\tif (plaintext.length === 0) return null;\n\t\ttry {\n\t\t\treturn JSON.parse(plaintext) as Result;\n\t\t} catch {\n\t\t\treturn plaintext as Result;\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** 按指定 CBC/ECB 模式加密历史 AES 字符串。 */\nexport function encryptLegacyAes(dataStr: string, key: string, vector: string, cipherMode?: LegacyAesCipherMode): string {\n\tconst mode = resolveLegacyAesMode(cipherMode);\n\treturn mode === \"ECB\" ? encryptLegacyAesEcb(dataStr, key) : encryptLegacyAesCbc(dataStr, key, vector);\n}\n\n/** 返回历史兼容的大写 MD5 十六进制摘要。 */\nexport function md5UpperHex(value: string): string {\n\treturn value.length === 0 ? value : md5Hex(value).toUpperCase();\n}\n\n/** 返回历史兼容的大写 SHA-1 十六进制摘要。 */\nexport function sha1UpperHex(value: string): string {\n\treturn value.length === 0 ? value : sha1Hex(value).toUpperCase();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/crypto/index.ts"],"sourcesContent":["import AES from \"crypto-js/aes.js\";\nimport CryptoCore from \"crypto-js/core.js\";\nimport Hex from \"crypto-js/enc-hex.js\";\nimport Utf8 from \"crypto-js/enc-utf8.js\";\nimport MD5 from \"crypto-js/md5.js\";\nimport ECB from \"crypto-js/mode-ecb.js\";\nimport \"crypto-js/pad-ansix923.js\";\nimport Iso10126 from \"crypto-js/pad-iso10126.js\";\nimport NoPadding from \"crypto-js/pad-nopadding.js\";\nimport Pkcs7 from \"crypto-js/pad-pkcs7.js\";\nimport ZeroPadding from \"crypto-js/pad-zeropadding.js\";\nimport SHA1 from \"crypto-js/sha1.js\";\nimport { decodeBase64Bytes, decodeBase64UrlBytes, encodeBase64Bytes, encodeBase64UrlBytes } from \"../base64/index\";\nimport { encodeUtf8, getTextDecoder } from \"../internal/text\";\n\n/** PBKDF2 默认迭代次数。 */\nconst defaultPbkdf2Iterations = 600_000;\n\n/** PBKDF2 允许的最小迭代次数。 */\nconst minimumPbkdf2Iterations = 100_000;\n\n/** PBKDF2 允许的最大迭代次数,用于限制异常输入造成的计算资源消耗。 */\nconst maximumPbkdf2Iterations = 5_000_000;\n\n/** 密码允许的最大 UTF-8 字节数。 */\nconst maximumPasswordBytes = 1024;\n\n/** 密码加密接口允许的最大明文字节数。 */\nconst maximumPlaintextBytes = 8 * 1024 * 1024;\n\n/** 密码解密接口允许的最大协议载荷字符数。 */\nconst maximumPayloadLength = 16 * 1024 * 1024;\n\n/** 密码加密载荷的协议与算法版本前缀。 */\nconst encryptedPayloadPrefix = \"FAST-AES-256-GCM-V2\";\n\n/** PBKDF2 密码哈希的协议与算法版本前缀。 */\nconst passwordHashPrefix = \"FAST-PBKDF2-SHA256-V1\";\n\n/** 直接 AES-GCM 密钥加密载荷的协议版本。 */\nconst authenticatedAesPayloadVersion = 1;\n\n/** 用于逐项验证实际依赖能力,而不是只判断 `subtle` 对象是否存在。 */\ntype RuntimeSubtleCrypto = Partial<\n\tPick<SubtleCrypto, \"decrypt\" | \"deriveBits\" | \"deriveKey\" | \"digest\" | \"encrypt\" | \"exportKey\" | \"generateKey\" | \"importKey\" | \"sign\" | \"verify\">\n>;\n/** Web Crypto 的运行时最小结构,避免用不安全的类型断言掩盖能力缺失。 */\ninterface RuntimeCrypto extends Partial<Pick<Crypto, \"getRandomValues\">> {\n\t/** 可选 SubtleCrypto 能力;密码原语入口会继续逐项验证所需方法。 */\n\tsubtle?: RuntimeSubtleCrypto;\n}\n\n/** Crypto 工具延迟读取的平台全局对象最小视图。 */\ninterface RuntimeCryptoGlobals {\n\t/** 可选 Web Crypto 实现;具体方法仍由每个能力入口逐项校验。 */\n\tcrypto?: RuntimeCrypto;\n}\n\n/** 延迟读取的 Web Crypto 全局对象视图,便于在缺少该能力的平台给出明确错误。 */\nconst runtimeCryptoGlobals = globalThis as unknown as RuntimeCryptoGlobals;\n\n/** AES 分组密码模式;与 .NET `CipherMode.CBC` 和 `CipherMode.ECB` 对应。 */\nexport type AesCipherMode = \"CBC\" | \"ECB\";\n\n/** AES 填充模式;与 .NET `PaddingMode` 中可由 CryptoJS 互操作的成员对应。 */\nexport type AesPaddingMode = \"None\" | \"PKCS7\" | \"Zeros\" | \"ANSIX923\" | \"ISO10126\";\n\n/** Web Crypto 导出的 PEM 公私钥对。 */\nexport interface PemKeyPair {\n\t/** 未加密的 PKCS#8 PEM 私钥,包含标准 `PRIVATE KEY` 头尾和 64 字符换行。 */\n\tprivateKey: string;\n\t/** SubjectPublicKeyInfo PEM 公钥,包含标准 `PUBLIC KEY` 头尾和 64 字符换行。 */\n\tpublicKey: string;\n}\n\n/** 本模块支持的 Web Crypto 椭圆曲线。 */\nexport type EcNamedCurve = \"P-256\" | \"P-384\" | \"P-521\";\n\n/**\n * 获取安全随机数能力。\n *\n * @remarks 随机字节和随机字符串不依赖 SubtleCrypto,因此这里与完整密码原语检查分开。\n * @returns 当前平台的 Crypto 对象。\n * @throws `Error` 当平台缺少 `getRandomValues`。\n */\nconst requireRandomCrypto = (): Crypto => {\n\tconst crypto = runtimeCryptoGlobals.crypto;\n\tif (typeof crypto?.getRandomValues !== \"function\") {\n\t\tthrow new Error(\"Web Crypto is unavailable in the current runtime.\");\n\t}\n\treturn crypto as Crypto;\n};\n\n/**\n * 获取本模块非随机 API 所需的完整 Web Crypto 能力。\n *\n * @returns 已确认实现摘要、派生、密钥导入导出、加解密、签名和验证方法的 Crypto 对象。\n * @throws `Error` 当任一必要 SubtleCrypto 方法缺失。\n */\nconst requireWebCrypto = (): Crypto => {\n\tconst crypto = requireRandomCrypto();\n\tconst subtle = (crypto as unknown as RuntimeCrypto).subtle;\n\tif (\n\t\ttypeof subtle?.decrypt !== \"function\" ||\n\t\ttypeof subtle.deriveBits !== \"function\" ||\n\t\ttypeof subtle.deriveKey !== \"function\" ||\n\t\ttypeof subtle.digest !== \"function\" ||\n\t\ttypeof subtle.encrypt !== \"function\" ||\n\t\ttypeof subtle.exportKey !== \"function\" ||\n\t\ttypeof subtle.generateKey !== \"function\" ||\n\t\ttypeof subtle.importKey !== \"function\" ||\n\t\ttypeof subtle.sign !== \"function\" ||\n\t\ttypeof subtle.verify !== \"function\"\n\t) {\n\t\tthrow new Error(\"Web Crypto SubtleCrypto is unavailable in the current runtime.\");\n\t}\n\treturn crypto;\n};\n\n/**\n * 把 Uint8Array 复制为独立的完整 ArrayBuffer。\n *\n * @remarks 不能直接返回 `bytes.buffer`,因为输入可能只是更大 Buffer 的切片。\n * @param bytes - 源字节视图。\n * @returns 长度与视图完全一致、偏移为零的新 ArrayBuffer。\n */\nconst toArrayBuffer = (bytes: Uint8Array): ArrayBuffer => {\n\tconst copy = new Uint8Array(bytes.byteLength);\n\tcopy.set(bytes);\n\treturn copy.buffer;\n};\n\n/** 本模块导出的 PKCS#8 与 SPKI PEM 标签。 */\nconst pemLabels = {\n\tprivate: \"PRIVATE KEY\",\n\tpublic: \"PUBLIC KEY\",\n} as const;\n\n/**\n * 把 DER 内容封装为 PEM。\n *\n * @param label - PEM Begin/End 标签,不包含分隔线。\n * @param value - DER 二进制内容。\n * @returns 每行最多 64 个 Base64 字符的 PEM 文本。\n */\nconst toPem = (label: string, value: ArrayBuffer): string => {\n\tconst encoded = encodeBase64Bytes(new Uint8Array(value));\n\tconst lines = encoded.match(/.{1,64}/gu)?.join(\"\\n\") ?? \"\";\n\treturn `-----BEGIN ${label}-----\\n${lines}\\n-----END ${label}-----`;\n};\n\n/**\n * 校验 PEM 标签并还原 DER。\n *\n * @param value - PEM 文本。\n * @param label - 当前算法预期的标签。\n * @returns 独立的 DER ArrayBuffer。\n * @throws `TypeError` 当 Begin/End 标签不匹配或 Base64 内容非法。\n */\nconst fromPem = (value: string, label: string): ArrayBuffer => {\n\tconst header = `-----BEGIN ${label}-----`;\n\tconst footer = `-----END ${label}-----`;\n\tconst trimmed = value.trim();\n\tif (!trimmed.startsWith(header) || !trimmed.endsWith(footer)) throw new TypeError(`Expected a ${label} PEM value.`);\n\tconst encoded = trimmed.slice(header.length, -footer.length).replace(/\\s+/gu, \"\");\n\treturn toArrayBuffer(decodeBase64Bytes(encoded));\n};\n\n/**\n * 导出 Web Crypto 密钥对。\n *\n * @param keyPair - 可导出的公私钥对。\n * @returns PKCS#8 私钥和 SPKI 公钥组成的 PEM 对象。\n * @throws `Error` 当平台拒绝导出或密钥格式不兼容。\n */\nconst exportKeyPair = async (keyPair: CryptoKeyPair): Promise<PemKeyPair> => {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.exportKey(\"pkcs8\", keyPair.privateKey),\n\t\tcrypto.subtle.exportKey(\"spki\", keyPair.publicKey),\n\t]);\n\treturn {\n\t\tprivateKey: toPem(pemLabels.private, privateKey),\n\t\tpublicKey: toPem(pemLabels.public, publicKey),\n\t};\n};\n\n/**\n * 缩小 Web Crypto `generateKey` 的联合返回值。\n *\n * @param value - 平台返回的单密钥或密钥对。\n * @returns 同时具有公钥和私钥的密钥对。\n * @throws `Error` 当平台没有按请求生成密钥对。\n */\nconst assertKeyPair = (value: CryptoKey | CryptoKeyPair): CryptoKeyPair => {\n\tif (\"privateKey\" in value && \"publicKey\" in value) return value;\n\tthrow new Error(\"The runtime did not generate a key pair.\");\n};\n\n/**\n * 校验并编码密码。\n *\n * @param password - 用户提供的密码文本。\n * @returns UTF-8 密码字节。\n * @throws `TypeError` 当密码为空。\n * @throws `RangeError` 当 UTF-8 长度超过 1,024 字节。\n */\nconst encodeValidatedPassword = (password: string): Uint8Array => {\n\tconst bytes = encodeUtf8(password);\n\tif (bytes.length === 0) throw new TypeError(\"The encryption password cannot be empty.\");\n\tif (bytes.length > maximumPasswordBytes) {\n\t\tthrow new RangeError(`The UTF-8 password cannot exceed ${maximumPasswordBytes} bytes.`);\n\t}\n\treturn bytes;\n};\n\n/**\n * 校验 PBKDF2 迭代次数。\n *\n * @param iterations - 待使用的迭代次数。\n * @returns 校验后的原始整数。\n * @throws `RangeError` 当值不是 100,000 至 5,000,000 的安全整数。\n */\nconst validateIterations = (iterations: number): number => {\n\tif (!Number.isSafeInteger(iterations) || iterations < minimumPbkdf2Iterations || iterations > maximumPbkdf2Iterations) {\n\t\tthrow new RangeError(`iterations must be a safe integer between ${minimumPbkdf2Iterations} and ${maximumPbkdf2Iterations}.`);\n\t}\n\treturn iterations;\n};\n\n/** 把字节格式化为小写十六进制。 */\nconst toLowerHex = (value: Uint8Array): string => Array.from(value, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n\n/** 把字节格式化为大写十六进制。 */\nconst toUpperHex = (value: Uint8Array): string => toLowerHex(value).toUpperCase();\n\n/**\n * 使用指定的 Web Crypto HMAC 算法计算原始认证标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @param hash - HMAC 使用的 SHA-2 摘要算法。\n * @returns 算法规定长度的原始认证标签。\n * @throws `TypeError` 当密钥为空。\n * @throws `Error` 当运行时缺少所需 Web Crypto 能力。\n */\nconst computeHmacBytes = async (value: string, key: string, hash: \"SHA-256\" | \"SHA-384\" | \"SHA-512\"): Promise<Uint8Array> => {\n\tconst keyBytes = encodeUtf8(key);\n\tif (keyBytes.length === 0) throw new TypeError(\"The HMAC key cannot be empty.\");\n\n\tconst crypto = requireWebCrypto();\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { hash, name: \"HMAC\" }, false, [\"sign\"]);\n\tconst signature = await crypto.subtle.sign(\"HMAC\", cryptoKey, toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(signature);\n};\n\n/**\n * 生成安全随机字节。\n *\n * @param length - 0 至 65,536 的安全整数;上限来自 Web Crypto 单次请求限制。\n * @returns 新建的 `Uint8Array`。\n * @throws 参数非法时抛出 `RangeError`;缺少 Web Crypto 时抛出 `Error`。\n */\nexport function GenerateRandomBytes(length: number): Uint8Array {\n\tif (!Number.isSafeInteger(length) || length < 0 || length > 65_536) {\n\t\tthrow new RangeError(\"length must be a safe integer from 0 through 65,536.\");\n\t}\n\treturn requireRandomCrypto().getRandomValues(new Uint8Array(length));\n}\n\n/**\n * 以不提前退出的方式比较两个字节数组。\n *\n * @remarks JavaScript 引擎不保证严格常量时间;该函数只避免显式短路,不能替代服务端\n * 密码学库提供的 timing-safe primitive。长度是否相同仍属于可观察信息。\n * @param left - 第一字节序列。\n * @param right - 第二字节序列。\n * @returns 长度和每个字节均相同时返回 `true`。\n */\nexport function FixedTimeEquals(left: Uint8Array, right: Uint8Array): boolean {\n\tconst length = Math.max(left.length, right.length);\n\tlet difference = left.length === right.length ? 0 : 1;\n\t// 不按长度或首个差异提前退出;缺失位置按零参与累计差异。\n\tfor (let index = 0; index < length; index += 1) difference |= (left[index] ?? 0) ^ (right[index] ?? 0);\n\treturn difference === 0;\n}\n\n/**\n * 计算 MD5 摘要并返回小写十六进制文本。\n *\n * @remarks MD5 仅用于非安全的普通校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 32 字符小写十六进制摘要。\n */\nexport function MD5Encrypt(value: string): string {\n\treturn MD5(value).toString(Hex);\n}\n\n/**\n * 计算 SHA-1 摘要并返回大写十六进制文本。\n *\n * @remarks SHA-1 仅用于非安全的普通校验,不得用于密码、签名或抗碰撞场景。\n * @param value - UTF-8 文本。\n * @returns 40 字符大写十六进制摘要。\n */\nexport function SHA1Encrypt(value: string): string {\n\treturn SHA1(value).toString(Hex).toUpperCase();\n}\n\n/**\n * 计算 SHA-256 摘要。\n *\n * @remarks SHA-256 是快速摘要,不适合直接存储或校验密码。\n * @param value - UTF-8 字符串或原始字节。\n * @returns 32 字节摘要。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function SHA256Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-256 并格式化为十六进制。\n *\n * @param value - UTF-8 字符串或原始字节。\n * @returns 64 字符大写十六进制文本。\n * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function SHA256Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA256Bytes(value));\n}\n\n/**\n * 计算 SHA-384 摘要。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 48 字节摘要。\n */\nexport async function SHA384Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-384\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-384 并格式化为十六进制文本。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 96 个大写十六进制字符组成的摘要。\n */\nexport async function SHA384Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA384Bytes(value));\n}\n\n/**\n * 计算 SHA-512 摘要。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 64 字节摘要。\n */\nexport async function SHA512Bytes(value: string): Promise<Uint8Array> {\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-512\", toArrayBuffer(encodeUtf8(value)));\n\treturn new Uint8Array(digest);\n}\n\n/**\n * 计算 SHA-512 并格式化为十六进制文本。\n *\n * @param value - UTF-8 文本或原始字节。\n * @returns 128 个大写十六进制字符组成的摘要。\n */\nexport async function SHA512Encrypt(value: string): Promise<string> {\n\treturn toUpperHex(await SHA512Bytes(value));\n}\n\n/**\n * 使用 HMAC-SHA-256 认证文本,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 64 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA256Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-256\"));\n}\n\n/**\n * 使用 HMAC-SHA-384 认证文本或字节,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 96 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA384Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-384\"));\n}\n\n/**\n * 使用 HMAC-SHA-512 认证文本或字节,并返回十六进制标签。\n *\n * @param value - 要认证的 UTF-8 文本或原始字节。\n * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。\n * @returns 128 个小写十六进制字符组成的认证标签。\n */\nexport async function HMACSHA512Encrypt(value: string, key: string): Promise<string> {\n\treturn toLowerHex(await computeHmacBytes(value, key, \"SHA-512\"));\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 从密码派生密钥。\n *\n * @param password - 1 至 1,024 UTF-8 字节的密码。\n * @param salt - 至少 8 字节的盐。\n * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。\n * @param outputLength - 输出长度,范围为 1 至 1,024 字节。\n * @returns 指定长度的派生密钥。\n * @throws 参数超过协议边界时抛出 `TypeError` 或 `RangeError`。\n */\nexport async function PBKDF2SHA256(password: string, salt: Uint8Array, iterations = defaultPbkdf2Iterations, outputLength = 32): Promise<Uint8Array> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (salt.length < 8) throw new RangeError(\"The PBKDF2 salt must contain at least 8 bytes; 16 or more is recommended.\");\n\tif (!Number.isSafeInteger(outputLength) || outputLength < 1 || outputLength > 1024) {\n\t\tthrow new RangeError(\"outputLength must be a safe integer between 1 and 1,024.\");\n\t}\n\n\t// 密码作为不可导出的 PBKDF2 原始材料导入,派生结果只通过 deriveBits 返回。\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveBits\"]);\n\tconst derived = await crypto.subtle.deriveBits(\n\t\t{ hash: \"SHA-256\", iterations: validateIterations(iterations), name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\toutputLength * 8\n\t);\n\treturn new Uint8Array(derived);\n}\n\n/**\n * 生成可持久化的随机盐 PBKDF2-HMAC-SHA-256 密码哈希。\n *\n * @param password - 1 至 1,024 UTF-8 字节的密码。\n * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。\n * @returns 包含版本、迭代次数、16 字节随机盐和 32 字节派生密钥的自描述字符串。\n */\nexport async function HashPasswordPBKDF2SHA256(password: string, iterations = defaultPbkdf2Iterations): Promise<string> {\n\t// 每个密码独立生成盐,避免相同密码产生相同持久化结果并提高预计算攻击成本。\n\tconst salt = GenerateRandomBytes(16);\n\tconst derivedKey = await PBKDF2SHA256(password, salt, iterations);\n\treturn [passwordHashPrefix, String(iterations), encodeBase64UrlBytes(salt), encodeBase64UrlBytes(derivedKey)].join(\":\");\n}\n\n/**\n * 验证 {@link HashPasswordPBKDF2SHA256} 生成的密码哈希。\n *\n * @param password - 要验证的密码。\n * @param passwordHash - 自描述的 PBKDF2-HMAC-SHA-256 密码哈希。\n * @returns 格式有效且密码匹配时返回 `true`;格式无效或密码错误时返回 `false`。\n */\nexport async function VerifyPasswordPBKDF2SHA256(password: string, passwordHash: string): Promise<boolean> {\n\ttry {\n\t\t// 先验证协议版本和字段边界,再执行高成本 PBKDF2,避免无效输入消耗不受控资源。\n\t\tconst parts = passwordHash.split(\":\");\n\t\tif (parts.length !== 4 || parts[0] !== passwordHashPrefix) return false;\n\t\tconst iterations = validateIterations(Number(parts[1]));\n\t\tconst salt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tconst expected = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tif (salt.length !== 16 || expected.length !== 32) return false;\n\t\tconst actual = await PBKDF2SHA256(password, salt, iterations, expected.length);\n\t\treturn FixedTimeEquals(actual, expected);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * 使用 RFC 5869 HKDF-SHA-256 派生上下文隔离的密钥材料。\n *\n * @param inputKeyMaterial - 输入密钥材料,例如 ECDH 原始共享秘密。\n * @param salt - 可选盐;空值按 RFC 5869 的零盐语义处理。\n * @param info - 应用、协议和密钥用途上下文。\n * @param outputLength - 输出长度,范围为 1 至 8,160 字节。\n * @returns 与 `salt` 和 `info` 绑定的派生密钥。\n */\nexport async function HKDFSHA256(\n\tinputKeyMaterial: Uint8Array,\n\tsalt: Uint8Array = new Uint8Array(),\n\tinfo: Uint8Array = new Uint8Array(),\n\toutputLength = 32\n): Promise<Uint8Array> {\n\tif (!Number.isSafeInteger(outputLength) || outputLength < 1 || outputLength > 255 * 32) {\n\t\tthrow new RangeError(\"outputLength must be a safe integer between 1 and 8,160.\");\n\t}\n\n\t// Web Crypto 的 HKDF 实现内部完成 RFC 5869 Extract 和 Expand,并且不会导出中间 PRK。\n\tconst crypto = requireWebCrypto();\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(inputKeyMaterial), \"HKDF\", false, [\"deriveBits\"]);\n\tconst derived = await crypto.subtle.deriveBits(\n\t\t{ hash: \"SHA-256\", info: toArrayBuffer(info), name: \"HKDF\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\toutputLength * 8\n\t);\n\treturn new Uint8Array(derived);\n}\n\n/**\n * 使用 AES-256 对 UTF-8 文本进行分组加密。\n *\n * @remarks 密钥和 IV 分别补字符 `f` 或截断到 32、16 个 UTF-16 Code Unit,与 .NET\n * `AESEncrypt` 保持一致。CBC/ECB 不提供完整性认证,密文可能被篡改。\n * @param dataStr - 要加密的 UTF-8 文本;空白文本返回 `null`。\n * @param key - 非空白的密钥文本。\n * @param vector - 非空白的初始化向量文本;ECB 模式仍要求传入该参数以对齐 .NET 签名。\n * @param cipherMode - AES 分组模式,默认 `CBC`。\n * @param paddingMode - AES 填充模式,默认 `PKCS7`。\n * @returns Base64 密文;输入、密钥或 IV 为空白时返回 `null`。\n * @throws 模式或填充不受支持时抛出 `RangeError`。\n */\nexport function AESEncrypt(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode: AesCipherMode = \"CBC\",\n\tpaddingMode: AesPaddingMode = \"PKCS7\"\n): string | null {\n\tif (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;\n\tif (cipherMode !== \"CBC\" && cipherMode !== \"ECB\") throw new RangeError('cipherMode must be \"CBC\" or \"ECB\".');\n\n\tlet padding = Pkcs7;\n\tswitch (paddingMode) {\n\t\tcase \"None\":\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"PKCS7\":\n\t\t\tbreak;\n\t\tcase \"Zeros\":\n\t\t\tpadding = ZeroPadding;\n\t\t\tbreak;\n\t\tcase \"ANSIX923\":\n\t\t\t// crypto-js 4.2.0 的 pad-ansix923 默认导出名称拼写错误,使用其注册到核心对象的实现。\n\t\t\tpadding = CryptoCore.pad.AnsiX923;\n\t\t\tbreak;\n\t\tcase \"ISO10126\":\n\t\t\tpadding = Iso10126;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new RangeError(\"paddingMode is not supported.\");\n\t}\n\tif (paddingMode === \"None\" && encodeUtf8(dataStr).length % 16 !== 0) {\n\t\tthrow new RangeError(\"AES plaintext must contain a whole number of 16-byte blocks when paddingMode is None.\");\n\t}\n\n\t// 按 .NET 入口的字符规则处理密钥和 IV,再由 CryptoJS 统一按 UTF-8 编码。\n\tconst keyBytes = Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n\tconst vectorBytes = Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\treturn AES.encrypt(dataStr, keyBytes, cipherMode === \"CBC\" ? { iv: vectorBytes, padding } : { iv: vectorBytes, mode: ECB, padding }).toString();\n}\n\n/**\n * 使用 AES-256 解密 Base64 分组密文。\n *\n * @remarks 参数归一化规则与 {@link AESEncrypt} 以及 .NET `AESDecrypt` 相同。\n * @param dataStr - Base64 密文;空白文本返回 `null`。\n * @param key - 加密时使用的密钥文本。\n * @param vector - 加密时使用的初始化向量文本。\n * @param cipherMode - AES 分组模式,默认 `CBC`。\n * @param paddingMode - AES 填充模式,默认 `PKCS7`。\n * @returns 解密后的 UTF-8 文本;输入、密钥或 IV 为空白时返回 `null`。\n * @throws 模式、填充、Base64、密钥或密文无效时抛出错误。\n */\nexport function AESDecrypt(\n\tdataStr: string,\n\tkey: string,\n\tvector: string,\n\tcipherMode: AesCipherMode = \"CBC\",\n\tpaddingMode: AesPaddingMode = \"PKCS7\"\n): string | null {\n\tif (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;\n\tif (cipherMode !== \"CBC\" && cipherMode !== \"ECB\") throw new RangeError('cipherMode must be \"CBC\" or \"ECB\".');\n\n\tlet padding = Pkcs7;\n\tswitch (paddingMode) {\n\t\tcase \"None\":\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"PKCS7\":\n\t\t\tbreak;\n\t\tcase \"Zeros\":\n\t\t\t// .NET 的 Zeros 解密不会移除尾部零字节,因此使用 NoPadding 保留完整明文块。\n\t\t\tpadding = NoPadding;\n\t\t\tbreak;\n\t\tcase \"ANSIX923\":\n\t\t\t// crypto-js 4.2.0 的 pad-ansix923 默认导出名称拼写错误,使用其注册到核心对象的实现。\n\t\t\tpadding = CryptoCore.pad.AnsiX923;\n\t\t\tbreak;\n\t\tcase \"ISO10126\":\n\t\t\tpadding = Iso10126;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new RangeError(\"paddingMode is not supported.\");\n\t}\n\tconst ciphertextBytes = decodeBase64Bytes(dataStr);\n\tif (ciphertextBytes.length === 0 || ciphertextBytes.length % 16 !== 0) {\n\t\tthrow new RangeError(\"AES ciphertext must contain one or more complete 16-byte blocks.\");\n\t}\n\n\t// 解密必须重复使用加密端相同的字符补齐和截断规则。\n\tconst keyBytes = Utf8.parse(key.padEnd(32, \"f\").slice(0, 32));\n\tconst vectorBytes = Utf8.parse(vector.padEnd(16, \"f\").slice(0, 16));\n\treturn AES.decrypt(dataStr, keyBytes, cipherMode === \"CBC\" ? { iv: vectorBytes, padding } : { iv: vectorBytes, mode: ECB, padding }).toString(\n\t\tUtf8\n\t);\n}\n\n/**\n * 使用 SHA-256 归一化文本密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 输出与 .NET `AESEncryptAuthenticated` 的 v1 Base64 二进制载荷完全一致。\n * @param plaintext - 要加密的 UTF-8 文本。\n * @param key - 非空的 UTF-8 文本密钥;内部归一化为 32 字节 SHA-256 摘要。\n * @returns Base64 编码的 v1 AES-GCM 认证载荷。\n * @throws 密钥为空或运行时缺少 Web Crypto 时抛出错误。\n */\nexport async function AESEncryptAuthenticated(plaintext: string, key: string): Promise<string> {\n\tif (key.trim().length === 0) throw new TypeError(\"The encryption key cannot be empty.\");\n\tconst crypto = requireWebCrypto();\n\tconst keyBytes = await SHA256Bytes(key);\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { name: \"AES-GCM\" }, false, [\"encrypt\"]);\n\t// 96 位随机 nonce 是 GCM 的标准高效长度;每次加密都生成新值,避免同一密钥下重复。\n\tconst nonce = GenerateRandomBytes(12);\n\tconst encrypted = new Uint8Array(\n\t\tawait crypto.subtle.encrypt({ iv: toArrayBuffer(nonce), name: \"AES-GCM\", tagLength: 128 }, cryptoKey, toArrayBuffer(encodeUtf8(plaintext)))\n\t);\n\tconst ciphertextLength = encrypted.length - 16;\n\t// .NET v1 协议字段顺序固定为 version || nonce || tag || ciphertext。\n\tconst payload = new Uint8Array(1 + nonce.length + 16 + ciphertextLength);\n\tpayload[0] = authenticatedAesPayloadVersion;\n\tpayload.set(nonce, 1);\n\tpayload.set(encrypted.subarray(ciphertextLength), 1 + nonce.length);\n\tpayload.set(encrypted.subarray(0, ciphertextLength), 1 + nonce.length + 16);\n\treturn encodeBase64Bytes(payload);\n}\n\n/**\n * 解密并认证 .NET `AESEncryptAuthenticated` 或 {@link AESEncryptAuthenticated} 生成的载荷。\n *\n * @param payload - Base64 编码的 v1 AES-GCM 二进制载荷。\n * @param key - 加密时使用的非空 UTF-8 文本密钥。\n * @returns 通过认证的 UTF-8 明文。\n * @throws 载荷格式无效、密钥错误或认证失败时抛出错误。\n */\nexport async function AESDecryptAuthenticated(payload: string, key: string): Promise<string> {\n\tif (key.trim().length === 0) throw new TypeError(\"The encryption key cannot be empty.\");\n\tconst decoded = decodeBase64Bytes(payload);\n\tif (decoded.length < 29 || decoded[0] !== authenticatedAesPayloadVersion) {\n\t\tthrow new TypeError(\"The AES-GCM payload format or version is not supported.\");\n\t}\n\n\tconst nonce = decoded.subarray(1, 13);\n\tconst tag = decoded.subarray(13, 29);\n\tconst ciphertext = decoded.subarray(29);\n\t// Web Crypto 接收 ciphertext || tag,因此把 .NET v1 的独立字段恢复为 Web Crypto 输入顺序。\n\tconst ciphertextAndTag = new Uint8Array(ciphertext.length + tag.length);\n\tciphertextAndTag.set(ciphertext);\n\tciphertextAndTag.set(tag, ciphertext.length);\n\tconst crypto = requireWebCrypto();\n\tconst keyBytes = await SHA256Bytes(key);\n\tconst cryptoKey = await crypto.subtle.importKey(\"raw\", toArrayBuffer(keyBytes), { name: \"AES-GCM\" }, false, [\"decrypt\"]);\n\tconst plaintext = await crypto.subtle.decrypt(\n\t\t{ iv: toArrayBuffer(nonce), name: \"AES-GCM\", tagLength: 128 },\n\t\tcryptoKey,\n\t\ttoArrayBuffer(ciphertextAndTag)\n\t);\n\treturn getTextDecoder().decode(plaintext);\n}\n\n/**\n * 使用 PBKDF2-HMAC-SHA-256 派生密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。\n *\n * @remarks 每次调用生成独立 16 字节盐与 12 字节 IV。输出是与 .NET `AESEncryptWithPassword`\n * 一致的 v2 自描述载荷,不应由业务代码手动拆分或修改。密码加密不替代密钥管理。\n * @param plaintext - 原始文本,不进行 JSON 推断;UTF-8 编码后最大 8 MiB。\n * @param password - 1 至 1024 UTF-8 字节的秘密口令。\n * @param iterations - PBKDF2 工作因子,默认 600,000。\n * @returns 认证密文字符串;相同输入每次产生不同结果。\n * @throws 口令非法时抛出 `TypeError` 或 `RangeError`;明文过大时抛出 `RangeError`;\n * 运行时缺少 Web Crypto 或 Encoding API 时抛出 `Error`。\n */\nexport async function AESEncryptWithPassword(plaintext: string, password: string, iterations = defaultPbkdf2Iterations): Promise<string> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tconst plaintextBytes = encodeUtf8(plaintext);\n\tif (plaintextBytes.length > maximumPlaintextBytes) {\n\t\tthrow new RangeError(`The UTF-8 plaintext cannot exceed ${maximumPlaintextBytes} bytes.`);\n\t}\n\tconst validatedIterations = validateIterations(iterations);\n\tconst crypto = requireWebCrypto();\n\tconst salt = GenerateRandomBytes(16);\n\tconst iv = GenerateRandomBytes(12);\n\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\t// AES-GCM 密钥只允许加密,且不允许从 Web Crypto 导出。\n\tconst key = await crypto.subtle.deriveKey(\n\t\t{ hash: \"SHA-256\", iterations: validatedIterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\tmaterial,\n\t\t{ length: 256, name: \"AES-GCM\" },\n\t\tfalse,\n\t\t[\"encrypt\"]\n\t);\n\t// Prefix 同时作为明文版本字段和 AAD,攻击者无法在不破坏认证标签的情况下替换协议版本。\n\tconst ciphertext = await crypto.subtle.encrypt(\n\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\tkey,\n\t\tplaintextBytes\n\t);\n\t// 字段顺序属于持久化协议:版本、KDF 成本、盐、IV、带 GCM Tag 的密文。\n\treturn [\n\t\tencryptedPayloadPrefix,\n\t\tString(validatedIterations),\n\t\tencodeBase64UrlBytes(salt),\n\t\tencodeBase64UrlBytes(iv),\n\t\tencodeBase64UrlBytes(new Uint8Array(ciphertext)),\n\t].join(\":\");\n}\n\n/**\n * 解密 {@link AESEncryptWithPassword} 生成的 v2 认证载荷。\n *\n * @param payload - 未修改的 v2 载荷,最大约 16 MiB 文本。\n * @param password - 加密时使用的口令。\n * @returns 原始 UTF-8 文本。\n * @throws 格式或字段非法时抛出 `TypeError`,载荷过大时抛出 `RangeError`,认证或密码\n * 失败及缺少平台能力时抛出 `Error`。\n */\nexport async function AESDecryptWithPassword(payload: string, password: string): Promise<string> {\n\tconst passwordBytes = encodeValidatedPassword(password);\n\tif (payload.length > maximumPayloadLength) {\n\t\tthrow new RangeError(\"The encrypted payload exceeds the supported size.\");\n\t}\n\t// 先验证固定字段数和版本,再对高成本 KDF 与解密进行任何工作。\n\tconst parts = payload.split(\":\");\n\tif (parts.length !== 5 || parts[0] !== encryptedPayloadPrefix) {\n\t\tthrow new TypeError(\"The encrypted payload format is not supported.\");\n\t}\n\n\tlet iterations: number;\n\tlet salt: Uint8Array;\n\tlet iv: Uint8Array;\n\tlet ciphertext: Uint8Array;\n\ttry {\n\t\titerations = validateIterations(Number(parts[1]));\n\t\tsalt = decodeBase64UrlBytes(parts[2] ?? \"\");\n\t\tiv = decodeBase64UrlBytes(parts[3] ?? \"\");\n\t\tciphertext = decodeBase64UrlBytes(parts[4] ?? \"\");\n\t\tif (salt.length !== 16 || iv.length !== 12 || ciphertext.length < 16) {\n\t\t\tthrow new TypeError(\"The encrypted payload has invalid field lengths.\");\n\t\t}\n\t} catch (cause) {\n\t\tthrow new TypeError(\"The encrypted payload contains invalid fields.\", { cause });\n\t}\n\n\tconst crypto = requireWebCrypto();\n\tconst textDecoder = getTextDecoder();\n\ttry {\n\t\tconst material = await crypto.subtle.importKey(\"raw\", toArrayBuffer(passwordBytes), \"PBKDF2\", false, [\"deriveKey\"]);\n\t\t// 解密密钥不允许导出,也不能被误用于加密。\n\t\tconst key = await crypto.subtle.deriveKey(\n\t\t\t{ hash: \"SHA-256\", iterations, name: \"PBKDF2\", salt: toArrayBuffer(salt) },\n\t\t\tmaterial,\n\t\t\t{ length: 256, name: \"AES-GCM\" },\n\t\t\tfalse,\n\t\t\t[\"decrypt\"]\n\t\t);\n\t\tconst plaintext = await crypto.subtle.decrypt(\n\t\t\t{ additionalData: toArrayBuffer(encodeUtf8(encryptedPayloadPrefix)), iv: toArrayBuffer(iv), name: \"AES-GCM\", tagLength: 128 },\n\t\t\tkey,\n\t\t\ttoArrayBuffer(ciphertext)\n\t\t);\n\t\treturn textDecoder.decode(plaintext);\n\t} catch (cause) {\n\t\tthrow new Error(\"The payload could not be authenticated or decrypted.\", { cause });\n\t}\n}\n\n/**\n * 生成可供 RSA-OAEP/SHA-256 与 RSA-PSS/SHA-256 共用的 PEM 密钥对。\n *\n * @param modulusLength - RSA 模数位数,默认 2,048;必须是不小于 2,048 的 256 倍数。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n * @throws 模数小于 2,048 或不是 256 的倍数时抛出 `RangeError`。\n */\nexport async function GenerateRSAKeyPair(modulusLength = 2048): Promise<PemKeyPair> {\n\tif (!Number.isSafeInteger(modulusLength) || modulusLength < 2048 || modulusLength % 256 !== 0) {\n\t\tthrow new RangeError(\"modulusLength must be a safe integer of at least 2048 and divisible by 256.\");\n\t}\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(\n\t\tawait crypto.subtle.generateKey(\n\t\t\t{\n\t\t\t\thash: \"SHA-256\",\n\t\t\t\tmodulusLength,\n\t\t\t\tname: \"RSA-OAEP\",\n\t\t\t\tpublicExponent: Uint8Array.of(1, 0, 1),\n\t\t\t},\n\t\t\ttrue,\n\t\t\t[\"decrypt\", \"encrypt\"]\n\t\t)\n\t);\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用 RSA-OAEP/SHA-256 公钥加密 UTF-8 文本。\n *\n * @param plaintext - 要加密的 UTF-8 文本;长度必须满足 RSA-OAEP 模数限制。\n * @param publicKeyPem - SubjectPublicKeyInfo PEM 公钥。\n * @returns Base64 编码的 RSA 密文。\n * @throws 公钥格式无效或明文超过 RSA-OAEP 容量时抛出错误。\n */\nexport async function RSAEncryptOAEP(plaintext: string, publicKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"encrypt\",\n\t]);\n\tconst ciphertext = await crypto.subtle.encrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(encodeUtf8(plaintext)));\n\treturn encodeBase64Bytes(new Uint8Array(ciphertext));\n}\n\n/**\n * 使用 RSA-OAEP/SHA-256 私钥解密 Base64 密文。\n *\n * @param ciphertext - Base64 编码的 RSA 密文。\n * @param privateKeyPem - 未加密的 PKCS#8 PEM 私钥。\n * @returns 解密后的 UTF-8 文本。\n * @throws 私钥、Base64 或密文无效时抛出错误。\n */\nexport async function RSADecryptOAEP(ciphertext: string, privateKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-OAEP\" }, false, [\n\t\t\"decrypt\",\n\t]);\n\tconst plaintext = await crypto.subtle.decrypt({ name: \"RSA-OAEP\" }, key, toArrayBuffer(decodeBase64Bytes(ciphertext)));\n\treturn getTextDecoder().decode(plaintext);\n}\n\n/**\n * 使用 RSA-PSS/SHA-256 私钥签名文本或字节。\n *\n * @param value - 要签名的 UTF-8 文本或原始字节。\n * @param privateKeyPem - 未加密的 PKCS#8 PEM 私钥。\n * @returns Base64 编码的 RSA-PSS 签名;盐长度固定为 32 字节。\n * @throws 私钥格式无效或签名失败时抛出错误。\n */\nexport async function RSASignPSS(value: string, privateKeyPem: string): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { hash: \"SHA-256\", name: \"RSA-PSS\" }, false, [\n\t\t\"sign\",\n\t]);\n\t// PSS 盐长度固定为 SHA-256 摘要长度,与 .NET RSASignaturePadding.Pss 的默认行为一致。\n\tconst signature = await crypto.subtle.sign({ name: \"RSA-PSS\", saltLength: 32 }, key, toArrayBuffer(encodeUtf8(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/**\n * 使用 RSA-PSS/SHA-256 公钥验证 Base64 签名。\n *\n * @param value - 签名时使用的 UTF-8 文本或原始字节。\n * @param signature - Base64 编码的 RSA-PSS 签名。\n * @param publicKeyPem - SubjectPublicKeyInfo PEM 公钥。\n * @returns 签名与内容、公钥匹配时返回 `true`。\n * @throws 公钥或 Base64 格式无效时抛出错误。\n */\nexport async function RSAVerifyPSS(value: string, signature: string, publicKeyPem: string): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { hash: \"SHA-256\", name: \"RSA-PSS\" }, false, [\n\t\t\"verify\",\n\t]);\n\t// 验证端必须使用与签名端相同的 32 字节 PSS 盐长度。\n\treturn crypto.subtle.verify(\n\t\t{ name: \"RSA-PSS\", saltLength: 32 },\n\t\tkey,\n\t\ttoArrayBuffer(decodeBase64Bytes(signature)),\n\t\ttoArrayBuffer(encodeUtf8(value))\n\t);\n}\n\n/**\n * 生成 ECDSA PEM 签名密钥对。\n *\n * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n */\nexport async function GenerateECDSAKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDSA\", namedCurve }, true, [\"sign\", \"verify\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用 ECDSA 私钥签名文本或字节。\n *\n * @remarks Web Crypto 返回 IEEE P1363 固定字段拼接格式,与 .NET 实现一致。\n * @param value - 要签名的 UTF-8 文本或原始字节。\n * @param privateKeyPem - 未加密的 EC PKCS#8 PEM 私钥。\n * @param namedCurve - 私钥使用的 NIST 曲线。\n * @returns Base64 编码的 IEEE P1363 ECDSA 签名。\n */\nexport async function ECDSASign(value: string, privateKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<string> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDSA\", namedCurve }, false, [\"sign\"]);\n\t// NIST 曲线强度分别对应 SHA-256、SHA-384 和 SHA-512;映射只在签名入口使用,因此直接保留在调用点。\n\tconst hash = namedCurve === \"P-256\" ? \"SHA-256\" : namedCurve === \"P-384\" ? \"SHA-384\" : \"SHA-512\";\n\tconst signature = await crypto.subtle.sign({ hash, name: \"ECDSA\" }, key, toArrayBuffer(encodeUtf8(value)));\n\treturn encodeBase64Bytes(new Uint8Array(signature));\n}\n\n/**\n * 使用 ECDSA 公钥验证 Base64 签名。\n *\n * @param value - 签名时使用的 UTF-8 文本或原始字节。\n * @param signature - Base64 编码的 IEEE P1363 ECDSA 签名。\n * @param publicKeyPem - EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 公钥使用的 NIST 曲线。\n * @returns 签名与内容、公钥和曲线匹配时返回 `true`。\n */\nexport async function ECDSAVerify(value: string, signature: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<boolean> {\n\tconst crypto = requireWebCrypto();\n\tconst key = await crypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDSA\", namedCurve }, false, [\"verify\"]);\n\t// 与签名入口保持相同的曲线/摘要映射,避免允许调用方组合不匹配的安全强度。\n\tconst hash = namedCurve === \"P-256\" ? \"SHA-256\" : namedCurve === \"P-384\" ? \"SHA-384\" : \"SHA-512\";\n\treturn crypto.subtle.verify({ hash, name: \"ECDSA\" }, key, toArrayBuffer(decodeBase64Bytes(signature)), toArrayBuffer(encodeUtf8(value)));\n}\n\n/**\n * 生成 ECDH PEM 密钥协商密钥对。\n *\n * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。\n * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。\n */\nexport async function GenerateECDHKeyPair(namedCurve: EcNamedCurve = \"P-256\"): Promise<PemKeyPair> {\n\tconst crypto = requireWebCrypto();\n\tconst keyPair = assertKeyPair(await crypto.subtle.generateKey({ name: \"ECDH\", namedCurve }, true, [\"deriveBits\"]));\n\treturn exportKeyPair(keyPair);\n}\n\n/**\n * 使用本方 ECDH 私钥与对方 ECDH 公钥派生共享秘密。\n *\n * @remarks 返回值仍需经过合适的 KDF 后才能作为对称密钥,不应直接长期存储。\n * @param privateKeyPem - 本方未加密的 EC PKCS#8 PEM 私钥。\n * @param publicKeyPem - 对方的 EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 双方密钥使用的 NIST 曲线。\n * @returns 曲线字段长度的原始 ECDH 共享秘密。\n */\nexport async function DeriveECDHSecret(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst crypto = requireWebCrypto();\n\tconst [privateKey, publicKey] = await Promise.all([\n\t\tcrypto.subtle.importKey(\"pkcs8\", fromPem(privateKeyPem, pemLabels.private), { name: \"ECDH\", namedCurve }, false, [\"deriveBits\"]),\n\t\tcrypto.subtle.importKey(\"spki\", fromPem(publicKeyPem, pemLabels.public), { name: \"ECDH\", namedCurve }, false, []),\n\t]);\n\t// P-521 字段需要按完整字节对齐,因此导出 66 字节(528 位),其余曲线直接使用字段位数。\n\tconst bitLength = namedCurve === \"P-256\" ? 256 : namedCurve === \"P-384\" ? 384 : 528;\n\tconst secret = await crypto.subtle.deriveBits({ name: \"ECDH\", public: publicKey }, privateKey, bitLength);\n\treturn new Uint8Array(secret);\n}\n\n/**\n * 使用 ECDH 后以 SHA-256 派生共享密钥。\n *\n * @remarks 相比直接使用原始共享秘密,此入口与 .NET `DeriveECDHKeySHA256` 一致并固定输出 32 字节。\n * @param privateKeyPem - 本方未加密的 EC PKCS#8 PEM 私钥。\n * @param publicKeyPem - 对方的 EC SubjectPublicKeyInfo PEM 公钥。\n * @param namedCurve - 双方密钥使用的 NIST 曲线。\n * @returns 32 字节共享密钥。\n */\nexport async function DeriveECDHKeySHA256(privateKeyPem: string, publicKeyPem: string, namedCurve: EcNamedCurve = \"P-256\"): Promise<Uint8Array> {\n\tconst secret = await DeriveECDHSecret(privateKeyPem, publicKeyPem, namedCurve);\n\tconst digest = await requireWebCrypto().subtle.digest(\"SHA-256\", toArrayBuffer(secret));\n\treturn new Uint8Array(digest);\n}\n"],"mappings":"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"}
@@ -25,7 +25,7 @@ interface InstallationIdentity {
25
25
  /**
26
26
  * 删除当前 `cacheKey` 对应的持久化标识,并把 `deviceId` 重置为空字符串。
27
27
  *
28
- * @throws `Error` 当 Storage 尚未配置或当前平台存储不可用。
28
+ * @throws `Error` 当当前平台存储不可用。
29
29
  */
30
30
  clear: () => void;
31
31
  /**
@@ -34,7 +34,7 @@ interface InstallationIdentity {
34
34
  * @param installationId - 可选 UUID v4;传入时覆盖内存值和当前持久化值。
35
35
  * @returns 已校验并同时写入 `deviceId` 与 `Local` 的 UUID v4。
36
36
  * @throws `TypeError` 当显式参数、内存值或持久化值不是 UUID v4。
37
- * @throws `Error` Storage 尚未配置,或生成新值时平台缺少 Web Crypto。
37
+ * @throws `Error` 当当前平台存储不可用,或生成新值时平台缺少 Web Crypto。
38
38
  */
39
39
  getOrCreate: (installationId?: string) => string;
40
40
  /**
@@ -43,7 +43,7 @@ interface InstallationIdentity {
43
43
  * @remarks 该方法不修改 `deviceId`,只负责读取;过期记录由 Storage 视为缺失。
44
44
  * @returns 已持久化的 UUID v4;键缺失或过期时返回 `undefined`。
45
45
  * @throws `TypeError` 当持久化值不是字符串或不是 UUID v4。
46
- * @throws `Error` 当 Storage 尚未配置或当前平台存储不可用。
46
+ * @throws `Error` 当当前平台存储不可用。
47
47
  */
48
48
  read: () => string | undefined;
49
49
  }
@@ -60,7 +60,7 @@ declare function configureInstallationIdentity(options?: InstallationIdentityCon
60
60
  /**
61
61
  * 全局安装标识状态。
62
62
  *
63
- * @remarks 使用前必须在应用入口调用 `configureStorage()`。默认随机源只使用 Web Crypto,
63
+ * @remarks Storage 未显式配置时会使用其默认值。默认随机源只使用 Web Crypto,
64
64
  * 能力缺失时明确抛错,不回退到 `Math.random()`。该值不是硬件标识、认证凭证或安全边界。
65
65
  */
66
66
  declare const installationIdentity: InstallationIdentity;
@@ -70,7 +70,7 @@ declare const installationIdentity: InstallationIdentity;
70
70
  * @param installationId - 可选的显式安装标识;传入时会校验并覆盖当前持久化值。
71
71
  * @returns 显式值、内存值、持久化值或新生成值中的最终安装标识。
72
72
  * @throws `TypeError` 当显式值或持久化值不是 UUID v4。
73
- * @throws `Error` Storage 尚未配置或平台缺少 Web Crypto。
73
+ * @throws `Error` 当当前平台存储不可用或缺少 Web Crypto。
74
74
  */
75
75
  declare function getOrCreateInstallationId(installationId?: string): string;
76
76
  //#endregion
@@ -43,7 +43,7 @@ function configureInstallationIdentity(options = {}) {
43
43
  /**
44
44
  * 全局安装标识状态。
45
45
  *
46
- * @remarks 使用前必须在应用入口调用 `configureStorage()`。默认随机源只使用 Web Crypto,
46
+ * @remarks Storage 未显式配置时会使用其默认值。默认随机源只使用 Web Crypto,
47
47
  * 能力缺失时明确抛错,不回退到 `Math.random()`。该值不是硬件标识、认证凭证或安全边界。
48
48
  */
49
49
  const installationIdentity = {
@@ -76,7 +76,7 @@ const installationIdentity = {
76
76
  * @param installationId - 可选的显式安装标识;传入时会校验并覆盖当前持久化值。
77
77
  * @returns 显式值、内存值、持久化值或新生成值中的最终安装标识。
78
78
  * @throws `TypeError` 当显式值或持久化值不是 UUID v4。
79
- * @throws `Error` Storage 尚未配置或平台缺少 Web Crypto。
79
+ * @throws `Error` 当当前平台存储不可用或缺少 Web Crypto。
80
80
  */
81
81
  function getOrCreateInstallationId(installationId) {
82
82
  return installationIdentity.getOrCreate(installationId);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/identity/index.ts"],"sourcesContent":["import { Local } from \"../storage/index.js\";\nimport { generateUuidV4, isUuidV4 } from \"../string/index.js\";\n\nconst defaultInstallationIdentityStorageKey = \"identity:installation-id\";\n\n/** {@link configureInstallationIdentity} 接收的安装标识配置。 */\nexport interface InstallationIdentityConfiguration {\n\t/**\n\t * `Local` 中使用的业务键,默认 `identity:installation-id`。\n\t *\n\t * @remarks 必须是无外围空白的非空字符串,并在首次访问 Identity API 前配置;物理键仍会叠加 Storage 全局前缀。\n\t */\n\tcacheKey?: string;\n}\n\n/** 浏览器或 uni-app 当前安装实例标识。 */\nexport interface InstallationIdentity {\n\t/**\n\t * `Local` 中使用的业务键。\n\t *\n\t * @remarks 首次读取会锁定默认配置;之后不能再切换为其他业务键。\n\t */\n\treadonly cacheKey: string;\n\t/**\n\t * 当前内存中的安装标识;尚未取得标识或调用 {@link InstallationIdentity.clear clear} 后为空字符串。\n\t *\n\t * @remarks 直接赋值只改变内存,不会校验或持久化;通常应调用 {@link InstallationIdentity.getOrCreate getOrCreate}。\n\t */\n\tdeviceId: string;\n\t/**\n\t * 删除当前 `cacheKey` 对应的持久化标识,并把 `deviceId` 重置为空字符串。\n\t *\n\t * @throws `Error` 当 Storage 尚未配置或当前平台存储不可用。\n\t */\n\tclear: () => void;\n\t/**\n\t * 按“显式参数、当前内存、持久化值、安全生成值”的优先级取得安装标识。\n\t *\n\t * @param installationId - 可选 UUID v4;传入时覆盖内存值和当前持久化值。\n\t * @returns 已校验并同时写入 `deviceId` 与 `Local` 的 UUID v4。\n\t * @throws `TypeError` 当显式参数、内存值或持久化值不是 UUID v4。\n\t * @throws `Error` Storage 尚未配置,或生成新值时平台缺少 Web Crypto。\n\t */\n\tgetOrCreate: (installationId?: string) => string;\n\t/**\n\t * 读取并校验当前 `cacheKey` 对应的持久化标识。\n\t *\n\t * @remarks 该方法不修改 `deviceId`,只负责读取;过期记录由 Storage 视为缺失。\n\t * @returns 已持久化的 UUID v4;键缺失或过期时返回 `undefined`。\n\t * @throws `TypeError` 当持久化值不是字符串或不是 UUID v4。\n\t * @throws `Error` 当 Storage 尚未配置或当前平台存储不可用。\n\t */\n\tread: () => string | undefined;\n}\n\n/**\n * 校验安装标识格式。\n *\n * @param value - 外部传入或从 Storage 读取的候选值。\n * @throws `TypeError` 当值不是 RFC 4122 UUID v4。\n */\nconst assertInstallationId = (value: string): void => {\n\tif (!isUuidV4(value)) throw new TypeError(\"Installation Identity values must be RFC 4122 version 4 UUIDs.\");\n};\n\nlet activeStorageKey: string | undefined;\n\n/**\n * 取得已经锁定的安装标识业务键。\n *\n * @remarks 首次读取会锁定默认值,防止标识已经写入后再切换键而产生两个安装标识。\n * @returns 应用于后续全部 Identity 操作的业务键。\n */\nconst getInstallationIdentityStorageKey = (): string => {\n\tactiveStorageKey ??= defaultInstallationIdentityStorageKey;\n\treturn activeStorageKey;\n};\n\n/**\n * 在应用入口配置安装标识使用的 Storage 业务键。\n *\n * @remarks 必须在首次读取 `installationIdentity.cacheKey` 或调用其他安装标识 API 前执行。相同配置\n * 可以幂等重复调用;切换到不同键会抛错,避免同一页面产生分裂状态。\n * @param options - 安装标识配置;省略 `cacheKey` 时使用 `identity:installation-id`。\n * @throws `TypeError` 当 `cacheKey` 不是非空字符串或包含外围空白。\n * @throws `Error` 当安装标识已经使用另一个业务键初始化。\n */\nexport function configureInstallationIdentity(options: InstallationIdentityConfiguration = {}): void {\n\tconst cacheKey = options.cacheKey ?? defaultInstallationIdentityStorageKey;\n\tif (typeof cacheKey !== \"string\" || cacheKey.length === 0 || cacheKey.trim() !== cacheKey) {\n\t\tthrow new TypeError(\"Installation Identity cacheKey must be a non-empty string without surrounding whitespace.\");\n\t}\n\tif (activeStorageKey === undefined) {\n\t\tactiveStorageKey = cacheKey;\n\t\treturn;\n\t}\n\tif (activeStorageKey !== cacheKey) throw new Error(\"Installation Identity has already been configured with a different cacheKey.\");\n}\n\n/**\n * 全局安装标识状态。\n *\n * @remarks 使用前必须在应用入口调用 `configureStorage()`。默认随机源只使用 Web Crypto,\n * 能力缺失时明确抛错,不回退到 `Math.random()`。该值不是硬件标识、认证凭证或安全边界。\n */\nexport const installationIdentity: InstallationIdentity = {\n\tget cacheKey(): string {\n\t\treturn getInstallationIdentityStorageKey();\n\t},\n\tdeviceId: \"\",\n\tclear(): void {\n\t\tLocal.remove(installationIdentity.cacheKey);\n\t\tinstallationIdentity.deviceId = \"\";\n\t},\n\tgetOrCreate(installationId?: string): string {\n\t\tconst candidate =\n\t\t\tinstallationId ??\n\t\t\t(installationIdentity.deviceId.length > 0 ? installationIdentity.deviceId : installationIdentity.read()) ??\n\t\t\tgenerateUuidV4();\n\t\tassertInstallationId(candidate);\n\t\tLocal.set(installationIdentity.cacheKey, candidate);\n\t\tinstallationIdentity.deviceId = candidate;\n\t\treturn candidate;\n\t},\n\tread(): string | undefined {\n\t\tconst stored = Local.get(installationIdentity.cacheKey);\n\t\tif (stored === undefined) return undefined;\n\t\tif (typeof stored !== \"string\") throw new TypeError(\"The stored identity is corrupted.\");\n\t\tassertInstallationId(stored);\n\t\treturn stored;\n\t},\n};\n\n/**\n * 返回已有安装标识,否则创建并持久化一个安全 UUID v4。\n *\n * @param installationId - 可选的显式安装标识;传入时会校验并覆盖当前持久化值。\n * @returns 显式值、内存值、持久化值或新生成值中的最终安装标识。\n * @throws `TypeError` 当显式值或持久化值不是 UUID v4。\n * @throws `Error` Storage 尚未配置或平台缺少 Web Crypto。\n */\nexport function getOrCreateInstallationId(installationId?: string): string {\n\treturn installationIdentity.getOrCreate(installationId);\n}\n"],"mappings":";;;AAGA,MAAM,wCAAwC;;;;;;;AA0D9C,MAAM,wBAAwB,UAAwB;CACrD,IAAI,CAAC,SAAS,KAAK,GAAG,MAAM,IAAI,UAAU,gEAAgE;AAC3G;AAEA,IAAI;;;;;;;AAQJ,MAAM,0CAAkD;CACvD,qBAAqB;CACrB,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,8BAA8B,UAA6C,CAAC,GAAS;CACpG,MAAM,WAAW,QAAQ,YAAY;CACrC,IAAI,OAAO,aAAa,YAAY,SAAS,WAAW,KAAK,SAAS,KAAK,MAAM,UAChF,MAAM,IAAI,UAAU,2FAA2F;CAEhH,IAAI,qBAAqB,KAAA,GAAW;EACnC,mBAAmB;EACnB;CACD;CACA,IAAI,qBAAqB,UAAU,MAAM,IAAI,MAAM,8EAA8E;AAClI;;;;;;;AAQA,MAAa,uBAA6C;CACzD,IAAI,WAAmB;EACtB,OAAO,kCAAkC;CAC1C;CACA,UAAU;CACV,QAAc;EACb,MAAM,OAAO,qBAAqB,QAAQ;EAC1C,qBAAqB,WAAW;CACjC;CACA,YAAY,gBAAiC;EAC5C,MAAM,YACL,mBACC,qBAAqB,SAAS,SAAS,IAAI,qBAAqB,WAAW,qBAAqB,KAAK,MACtG,eAAe;EAChB,qBAAqB,SAAS;EAC9B,MAAM,IAAI,qBAAqB,UAAU,SAAS;EAClD,qBAAqB,WAAW;EAChC,OAAO;CACR;CACA,OAA2B;EAC1B,MAAM,SAAS,MAAM,IAAI,qBAAqB,QAAQ;EACtD,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;EACjC,IAAI,OAAO,WAAW,UAAU,MAAM,IAAI,UAAU,mCAAmC;EACvF,qBAAqB,MAAM;EAC3B,OAAO;CACR;AACD;;;;;;;;;AAUA,SAAgB,0BAA0B,gBAAiC;CAC1E,OAAO,qBAAqB,YAAY,cAAc;AACvD"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/identity/index.ts"],"sourcesContent":["import { Local } from \"../storage/index\";\nimport { generateUuidV4, isUuidV4 } from \"../string/index\";\n\nconst defaultInstallationIdentityStorageKey = \"identity:installation-id\";\n\n/** {@link configureInstallationIdentity} 接收的安装标识配置。 */\nexport interface InstallationIdentityConfiguration {\n\t/**\n\t * `Local` 中使用的业务键,默认 `identity:installation-id`。\n\t *\n\t * @remarks 必须是无外围空白的非空字符串,并在首次访问 Identity API 前配置;物理键仍会叠加 Storage 全局前缀。\n\t */\n\tcacheKey?: string;\n}\n\n/** 浏览器或 uni-app 当前安装实例标识。 */\nexport interface InstallationIdentity {\n\t/**\n\t * `Local` 中使用的业务键。\n\t *\n\t * @remarks 首次读取会锁定默认配置;之后不能再切换为其他业务键。\n\t */\n\treadonly cacheKey: string;\n\t/**\n\t * 当前内存中的安装标识;尚未取得标识或调用 {@link InstallationIdentity.clear clear} 后为空字符串。\n\t *\n\t * @remarks 直接赋值只改变内存,不会校验或持久化;通常应调用 {@link InstallationIdentity.getOrCreate getOrCreate}。\n\t */\n\tdeviceId: string;\n\t/**\n\t * 删除当前 `cacheKey` 对应的持久化标识,并把 `deviceId` 重置为空字符串。\n\t *\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tclear: () => void;\n\t/**\n\t * 按“显式参数、当前内存、持久化值、安全生成值”的优先级取得安装标识。\n\t *\n\t * @param installationId - 可选 UUID v4;传入时覆盖内存值和当前持久化值。\n\t * @returns 已校验并同时写入 `deviceId` 与 `Local` 的 UUID v4。\n\t * @throws `TypeError` 当显式参数、内存值或持久化值不是 UUID v4。\n\t * @throws `Error` 当当前平台存储不可用,或生成新值时平台缺少 Web Crypto。\n\t */\n\tgetOrCreate: (installationId?: string) => string;\n\t/**\n\t * 读取并校验当前 `cacheKey` 对应的持久化标识。\n\t *\n\t * @remarks 该方法不修改 `deviceId`,只负责读取;过期记录由 Storage 视为缺失。\n\t * @returns 已持久化的 UUID v4;键缺失或过期时返回 `undefined`。\n\t * @throws `TypeError` 当持久化值不是字符串或不是 UUID v4。\n\t * @throws `Error` 当当前平台存储不可用。\n\t */\n\tread: () => string | undefined;\n}\n\n/**\n * 校验安装标识格式。\n *\n * @param value - 外部传入或从 Storage 读取的候选值。\n * @throws `TypeError` 当值不是 RFC 4122 UUID v4。\n */\nconst assertInstallationId = (value: string): void => {\n\tif (!isUuidV4(value)) throw new TypeError(\"Installation Identity values must be RFC 4122 version 4 UUIDs.\");\n};\n\nlet activeStorageKey: string | undefined;\n\n/**\n * 取得已经锁定的安装标识业务键。\n *\n * @remarks 首次读取会锁定默认值,防止标识已经写入后再切换键而产生两个安装标识。\n * @returns 应用于后续全部 Identity 操作的业务键。\n */\nconst getInstallationIdentityStorageKey = (): string => {\n\tactiveStorageKey ??= defaultInstallationIdentityStorageKey;\n\treturn activeStorageKey;\n};\n\n/**\n * 在应用入口配置安装标识使用的 Storage 业务键。\n *\n * @remarks 必须在首次读取 `installationIdentity.cacheKey` 或调用其他安装标识 API 前执行。相同配置\n * 可以幂等重复调用;切换到不同键会抛错,避免同一页面产生分裂状态。\n * @param options - 安装标识配置;省略 `cacheKey` 时使用 `identity:installation-id`。\n * @throws `TypeError` 当 `cacheKey` 不是非空字符串或包含外围空白。\n * @throws `Error` 当安装标识已经使用另一个业务键初始化。\n */\nexport function configureInstallationIdentity(options: InstallationIdentityConfiguration = {}): void {\n\tconst cacheKey = options.cacheKey ?? defaultInstallationIdentityStorageKey;\n\tif (typeof cacheKey !== \"string\" || cacheKey.length === 0 || cacheKey.trim() !== cacheKey) {\n\t\tthrow new TypeError(\"Installation Identity cacheKey must be a non-empty string without surrounding whitespace.\");\n\t}\n\tif (activeStorageKey === undefined) {\n\t\tactiveStorageKey = cacheKey;\n\t\treturn;\n\t}\n\tif (activeStorageKey !== cacheKey) throw new Error(\"Installation Identity has already been configured with a different cacheKey.\");\n}\n\n/**\n * 全局安装标识状态。\n *\n * @remarks Storage 未显式配置时会使用其默认值。默认随机源只使用 Web Crypto,\n * 能力缺失时明确抛错,不回退到 `Math.random()`。该值不是硬件标识、认证凭证或安全边界。\n */\nexport const installationIdentity: InstallationIdentity = {\n\tget cacheKey(): string {\n\t\treturn getInstallationIdentityStorageKey();\n\t},\n\tdeviceId: \"\",\n\tclear(): void {\n\t\tLocal.remove(installationIdentity.cacheKey);\n\t\tinstallationIdentity.deviceId = \"\";\n\t},\n\tgetOrCreate(installationId?: string): string {\n\t\tconst candidate =\n\t\t\tinstallationId ??\n\t\t\t(installationIdentity.deviceId.length > 0 ? installationIdentity.deviceId : installationIdentity.read()) ??\n\t\t\tgenerateUuidV4();\n\t\tassertInstallationId(candidate);\n\t\tLocal.set(installationIdentity.cacheKey, candidate);\n\t\tinstallationIdentity.deviceId = candidate;\n\t\treturn candidate;\n\t},\n\tread(): string | undefined {\n\t\tconst stored = Local.get(installationIdentity.cacheKey);\n\t\tif (stored === undefined) return undefined;\n\t\tif (typeof stored !== \"string\") throw new TypeError(\"The stored identity is corrupted.\");\n\t\tassertInstallationId(stored);\n\t\treturn stored;\n\t},\n};\n\n/**\n * 返回已有安装标识,否则创建并持久化一个安全 UUID v4。\n *\n * @param installationId - 可选的显式安装标识;传入时会校验并覆盖当前持久化值。\n * @returns 显式值、内存值、持久化值或新生成值中的最终安装标识。\n * @throws `TypeError` 当显式值或持久化值不是 UUID v4。\n * @throws `Error` 当当前平台存储不可用或缺少 Web Crypto。\n */\nexport function getOrCreateInstallationId(installationId?: string): string {\n\treturn installationIdentity.getOrCreate(installationId);\n}\n"],"mappings":";;;AAGA,MAAM,wCAAwC;;;;;;;AA0D9C,MAAM,wBAAwB,UAAwB;CACrD,IAAI,CAAC,SAAS,KAAK,GAAG,MAAM,IAAI,UAAU,gEAAgE;AAC3G;AAEA,IAAI;;;;;;;AAQJ,MAAM,0CAAkD;CACvD,qBAAqB;CACrB,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,8BAA8B,UAA6C,CAAC,GAAS;CACpG,MAAM,WAAW,QAAQ,YAAY;CACrC,IAAI,OAAO,aAAa,YAAY,SAAS,WAAW,KAAK,SAAS,KAAK,MAAM,UAChF,MAAM,IAAI,UAAU,2FAA2F;CAEhH,IAAI,qBAAqB,KAAA,GAAW;EACnC,mBAAmB;EACnB;CACD;CACA,IAAI,qBAAqB,UAAU,MAAM,IAAI,MAAM,8EAA8E;AAClI;;;;;;;AAQA,MAAa,uBAA6C;CACzD,IAAI,WAAmB;EACtB,OAAO,kCAAkC;CAC1C;CACA,UAAU;CACV,QAAc;EACb,MAAM,OAAO,qBAAqB,QAAQ;EAC1C,qBAAqB,WAAW;CACjC;CACA,YAAY,gBAAiC;EAC5C,MAAM,YACL,mBACC,qBAAqB,SAAS,SAAS,IAAI,qBAAqB,WAAW,qBAAqB,KAAK,MACtG,eAAe;EAChB,qBAAqB,SAAS;EAC9B,MAAM,IAAI,qBAAqB,UAAU,SAAS;EAClD,qBAAqB,WAAW;EAChC,OAAO;CACR;CACA,OAA2B;EAC1B,MAAM,SAAS,MAAM,IAAI,qBAAqB,QAAQ;EACtD,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;EACjC,IAAI,OAAO,WAAW,UAAU,MAAM,IAAI,UAAU,mCAAmC;EACvF,qBAAqB,MAAM;EAC3B,OAAO;CACR;AACD;;;;;;;;;AAUA,SAAgB,0BAA0B,gBAAiC;CAC1E,OAAO,qBAAqB,YAAY,cAAc;AACvD"}
package/dist/index.d.mts CHANGED
@@ -2,7 +2,7 @@ import { KeySelector, allEqualBy, chunk, difference, groupBy, hasDuplicatesBy, i
2
2
  import { AbortOptions, ConcurrentMapOptions, DebouncedFunction, RetryContext, RetryOptions, ThrottledFunction, TimeoutOptions, debounce, mapConcurrent, retry, sleep, throttle, withTimeout } from "./async/index.mjs";
3
3
  import { decodeBase64, decodeBase64Bytes, decodeBase64Url, decodeBase64UrlBytes, decodeLatin1Base64, decodeSecureBase64, encodeBase64, encodeBase64Bytes, encodeBase64Url, encodeBase64UrlBytes, encodeLatin1Base64, encodeSecureBase64 } from "./base64/index.mjs";
4
4
  import { RgbColor, RgbaColor, contrastRatio, formatHexColor, mixHexColorWithBlack, mixHexColorWithWhite, mixHexColors, parseHexColor, pickHigherContrastColor, relativeLuminance } from "./color/index.mjs";
5
- import { EcNamedCurve, LegacyAesCipherMode, PasswordEncryptionOptions, PemKeyPair, RsaKeyPairOptions, TextOrBytes, areBytesEqualWithoutEarlyExit, decryptLegacyAesCbc, decryptLegacyAesEcb, decryptLegacyAesValue, decryptRsaOaep, decryptTextWithPassword, deriveEcdhSecret, encryptLegacyAes, encryptLegacyAesCbc, encryptLegacyAesEcb, encryptRsaOaep, encryptTextWithPassword, generateEcdhKeyPair, generateEcdsaKeyPair, generateRandomBytes, generateRsaOaepKeyPair, md5Hex, md5UpperHex, sha1Hex, sha1UpperHex, sha256Bytes, sha256Hex, signEcdsa, verifyEcdsa } from "./crypto/index.mjs";
5
+ import { AESDecrypt, AESDecryptAuthenticated, AESDecryptWithPassword, AESEncrypt, AESEncryptAuthenticated, AESEncryptWithPassword, AesCipherMode, AesPaddingMode, DeriveECDHKeySHA256, DeriveECDHSecret, ECDSASign, ECDSAVerify, EcNamedCurve, FixedTimeEquals, GenerateECDHKeyPair, GenerateECDSAKeyPair, GenerateRSAKeyPair, GenerateRandomBytes, HKDFSHA256, HMACSHA256Encrypt, HMACSHA384Encrypt, HMACSHA512Encrypt, HashPasswordPBKDF2SHA256, MD5Encrypt, PBKDF2SHA256, PemKeyPair, RSADecryptOAEP, RSAEncryptOAEP, RSASignPSS, RSAVerifyPSS, SHA1Encrypt, SHA256Bytes, SHA256Encrypt, SHA384Bytes, SHA384Encrypt, SHA512Bytes, SHA512Encrypt, VerifyPasswordPBKDF2SHA256 } from "./crypto/index.mjs";
6
6
  import { DateInput, DateRangeShortcut, DateShortcut, RelativeTimeOptions, addDays, addMonths, addYears, createDateRangeShortcuts, createDateShortcuts, createOneMonthRangeFromToday, endOfDay, formatChineseRelativeTime, formatRelativeTime, getLocalDayBounds, getLocalTimeGreeting, getStartOfToday, isDateAfterNow, isFuture, isSameDay, isValidDate, isWithinInterval, startOfDay, toDate } from "./date/index.mjs";
7
7
  import { StyleInput, StyleObject, StyleValue, addCssUnit, serializeStyle } from "./dom/style.mjs";
8
8
  import { RuntimeKind, detectRuntime, hasWebCrypto, isBrowser, isMobileUserAgent, isNode, isTabletUserAgent, isUniApp, isWebWorker } from "./env/index.mjs";
@@ -15,10 +15,10 @@ import { ParsedQueryParameters, StringLocale, camelCase, decodeURIComponentRepea
15
15
  import { EmitHandlers, useEmits } from "./vue/emits.mjs";
16
16
  import { useExpose } from "./vue/expose.mjs";
17
17
  import { AwaitableFunction, callOptionalFunction } from "./vue/func.mjs";
18
- import { Installable, TSXWithInstall, VueInstallValue, VueRegistrationTarget, withInstall, withInstallDirective, withNoopInstall } from "./vue/install.mjs";
18
+ import { Installable, TSXWithInstall, VueInstallValue, withInstall, withInstallDirective, withNoopInstall } from "./vue/install.mjs";
19
19
  import { definePropType, useProps } from "./vue/props.mjs";
20
20
  import { useRender } from "./vue/render.mjs";
21
21
  import { TypedSlots, TypedSlotsDeclaration, makeSlots } from "./vue/slots.mjs";
22
22
  import { withDefineType } from "./vue/with.mjs";
23
23
  import "./vue/index.mjs";
24
- export { AbortOptions, AwaitableFunction, ConcurrentMapOptions, DateInput, DateRangeShortcut, DateShortcut, DebouncedFunction, EcNamedCurve, EmitHandlers, FormatBytesOptions, Installable, InstallationIdentity, InstallationIdentityConfiguration, KeySelector, LegacyAesCipherMode, Local, LogLevel, Logger, LoggerOptions, LoggerSink, ParsedQueryParameters, PasswordEncryptionOptions, PemKeyPair, QueryPrimitive, QueryStringOptions, QueryValue, RelativeTimeOptions, RetryContext, RetryOptions, RgbColor, RgbaColor, RsaKeyPairOptions, RuntimeKind, Session, StorageArea, StorageCodec, StorageConfiguration, StorageWriteOptions, StringLocale, StyleInput, StyleObject, StyleValue, TSXWithInstall, TextOrBytes, ThrottledFunction, TimeoutOptions, TypedSlots, TypedSlotsDeclaration, VueInstallValue, VueRegistrationTarget, addCssUnit, addDays, addMonths, addYears, allEqualBy, areBytesEqualWithoutEarlyExit, average, base64StorageCodec, callOptionalFunction, camelCase, chunk, clamp, configureInstallationIdentity, configureStorage, contrastRatio, createDateRangeShortcuts, createDateShortcuts, createLogger, createOneMonthRangeFromToday, debounce, decodeBase64, decodeBase64Bytes, decodeBase64Url, decodeBase64UrlBytes, decodeLatin1Base64, decodeSecureBase64, decodeURIComponentRepeatedly, decryptLegacyAesCbc, decryptLegacyAesEcb, decryptLegacyAesValue, decryptRsaOaep, decryptTextWithPassword, definePropType, deriveEcdhSecret, detectRuntime, difference, encodeBase64, encodeBase64Bytes, encodeBase64Url, encodeBase64UrlBytes, encodeLatin1Base64, encodeSecureBase64, encryptLegacyAes, encryptLegacyAesCbc, encryptLegacyAesEcb, encryptRsaOaep, encryptTextWithPassword, endOfDay, escapeHtml, formatBytes, formatChineseRelativeTime, formatHexColor, formatRelativeTime, generateEcdhKeyPair, generateEcdsaKeyPair, generateRandomBytes, generateRsaOaepKeyPair, generateUuidV4, getLocalDayBounds, getLocalTimeGreeting, getOrCreateInstallationId, getStartOfToday, groupBy, hasDuplicatesBy, hasOwn, hasWebCrypto, inRange, installationIdentity, intersection, isBrowser, isDateAfterNow, isFuture, isMobileUserAgent, isNode, isPlainObject, isSameDay, isStorageConfigured, isTabletUserAgent, isUniApp, isUuidV4, isValidDate, isValidJson, isWebWorker, isWithinInterval, kebabCase, lerp, logger, lowerFirst, makeSlots, mapConcurrent, mapValues, md5Hex, md5UpperHex, mixHexColorWithBlack, mixHexColorWithWhite, mixHexColors, normalizeWhitespace, omit, parseHexColor, parseQueryString, partition, pascalCase, pick, pickHigherContrastColor, relativeLuminance, removeNullishValues, retry, roundTo, secureRandomInt, secureRandomString, serializeStyle, sha1Hex, sha1UpperHex, sha256Bytes, sha256Hex, shallowEqual, signEcdsa, sleep, splitWords, startOfDay, sum, throttle, toDate, toQueryString, truncateGraphemes, unique, uniqueBy, upperFirst, useEmits, useExpose, useProps, useRender, verifyEcdsa, withDefineType, withInstall, withInstallDirective, withNoopInstall, withTimeout };
24
+ export { AESDecrypt, AESDecryptAuthenticated, AESDecryptWithPassword, AESEncrypt, AESEncryptAuthenticated, AESEncryptWithPassword, AbortOptions, AesCipherMode, AesPaddingMode, AwaitableFunction, ConcurrentMapOptions, DateInput, DateRangeShortcut, DateShortcut, DebouncedFunction, DeriveECDHKeySHA256, DeriveECDHSecret, ECDSASign, ECDSAVerify, EcNamedCurve, EmitHandlers, FixedTimeEquals, FormatBytesOptions, GenerateECDHKeyPair, GenerateECDSAKeyPair, GenerateRSAKeyPair, GenerateRandomBytes, HKDFSHA256, HMACSHA256Encrypt, HMACSHA384Encrypt, HMACSHA512Encrypt, HashPasswordPBKDF2SHA256, Installable, InstallationIdentity, InstallationIdentityConfiguration, KeySelector, Local, LogLevel, Logger, LoggerOptions, LoggerSink, MD5Encrypt, PBKDF2SHA256, ParsedQueryParameters, PemKeyPair, QueryPrimitive, QueryStringOptions, QueryValue, RSADecryptOAEP, RSAEncryptOAEP, RSASignPSS, RSAVerifyPSS, RelativeTimeOptions, RetryContext, RetryOptions, RgbColor, RgbaColor, RuntimeKind, SHA1Encrypt, SHA256Bytes, SHA256Encrypt, SHA384Bytes, SHA384Encrypt, SHA512Bytes, SHA512Encrypt, Session, StorageArea, StorageCodec, StorageConfiguration, StorageWriteOptions, StringLocale, StyleInput, StyleObject, StyleValue, TSXWithInstall, ThrottledFunction, TimeoutOptions, TypedSlots, TypedSlotsDeclaration, VerifyPasswordPBKDF2SHA256, VueInstallValue, addCssUnit, addDays, addMonths, addYears, allEqualBy, average, base64StorageCodec, callOptionalFunction, camelCase, chunk, clamp, configureInstallationIdentity, configureStorage, contrastRatio, createDateRangeShortcuts, createDateShortcuts, createLogger, createOneMonthRangeFromToday, debounce, decodeBase64, decodeBase64Bytes, decodeBase64Url, decodeBase64UrlBytes, decodeLatin1Base64, decodeSecureBase64, decodeURIComponentRepeatedly, definePropType, detectRuntime, difference, encodeBase64, encodeBase64Bytes, encodeBase64Url, encodeBase64UrlBytes, encodeLatin1Base64, encodeSecureBase64, endOfDay, escapeHtml, formatBytes, formatChineseRelativeTime, formatHexColor, formatRelativeTime, generateUuidV4, getLocalDayBounds, getLocalTimeGreeting, getOrCreateInstallationId, getStartOfToday, groupBy, hasDuplicatesBy, hasOwn, hasWebCrypto, inRange, installationIdentity, intersection, isBrowser, isDateAfterNow, isFuture, isMobileUserAgent, isNode, isPlainObject, isSameDay, isStorageConfigured, isTabletUserAgent, isUniApp, isUuidV4, isValidDate, isValidJson, isWebWorker, isWithinInterval, kebabCase, lerp, logger, lowerFirst, makeSlots, mapConcurrent, mapValues, mixHexColorWithBlack, mixHexColorWithWhite, mixHexColors, normalizeWhitespace, omit, parseHexColor, parseQueryString, partition, pascalCase, pick, pickHigherContrastColor, relativeLuminance, removeNullishValues, retry, roundTo, secureRandomInt, secureRandomString, serializeStyle, shallowEqual, sleep, splitWords, startOfDay, sum, throttle, toDate, toQueryString, truncateGraphemes, unique, uniqueBy, upperFirst, useEmits, useExpose, useProps, useRender, withDefineType, withInstall, withInstallDirective, withNoopInstall, withTimeout };
@@ -0,0 +1,3 @@
1
+ var FastUtils=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=Object.create,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,a=Object.getOwnPropertyNames,o=Object.getPrototypeOf,s=Object.prototype.hasOwnProperty,c=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),l=(e,t,n,o)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=a(t),l=0,u=c.length,d;l<u;l++)d=c[l],!s.call(e,d)&&d!==n&&r(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(o=i(t,d))||o.enumerable});return e},u=(e,t,i)=>(i=e==null?{}:n(o(e)),l(t||!e||!e.__esModule||!s.call(e,`default`)?r(i,`default`,{value:e,enumerable:!0}):i,e));function d(e,t){if(!Number.isSafeInteger(t)||t<=0)throw RangeError(`size must be a positive safe integer.`);let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function f(e){return e.filter(e=>e!=null)}function p(e){let t=[],n=new Set;for(let r=0;r<e.length;r+=1){if(!(r in e))continue;let i=e[r];n.has(i)||(n.add(i),t.push(i))}return t}function m(e,t){let n=new Set,r=[];for(let i=0;i<e.length;i+=1){let a=e[i];if(a===void 0&&!(i in e))continue;let o=t(a,i);n.has(o)||(n.add(o),r.push(a))}return r}function h(e,t){let n=new Map;return e.forEach((e,r)=>{let i=t(e,r),a=n.get(i);a===void 0?n.set(i,[e]):a.push(e)}),n}function g(e,t){let n=[],r=[];return e.forEach((e,i)=>(t(e,i)?n:r).push(e)),[n,r]}function _(e,t){let n=new Set(p(t));return p(e).filter(e=>!n.has(e))}function v(e,t){let n=new Set(p(t));return p(e).filter(e=>n.has(e))}function y(e,t){let n=new Set;for(let r=0;r<e.length;r+=1){let i=e[r];if(i===void 0&&!(r in e))continue;let a=t(i,r);if(n.has(a))return!0;n.add(a)}return!1}function b(e,t){let n,r=!1;for(let i=0;i<e.length;i+=1){let a=e[i];if(a===void 0&&!(i in e))continue;let o=t(a,i);if(!r){n=o,r=!0;continue}if(!(n===o||Number.isNaN(n)&&Number.isNaN(o)))return!1}return!0}let x=2147483647,S=e=>{let t=Error(`The operation was aborted.`,{cause:e.reason});return t.name=`AbortError`,t},C=e=>{if(e?.aborted)throw S(e)},w=(e,t=`milliseconds`)=>{if(!Number.isFinite(e)||e<0||e>x)throw RangeError(`${t} must be a finite number from 0 through ${x}.`);return e};function T(e,t={}){let n=w(e),r=t.signal;return C(r),new Promise((e,t)=>{let i=()=>{r!==void 0&&(clearTimeout(a),t(S(r)))},a=setTimeout(()=>{r?.removeEventListener(`abort`,i),e()},n);r?.addEventListener(`abort`,i,{once:!0})})}function E(e,t,n={}){let r=w(t,`timeoutMs`),i=n.signal;return C(i),new Promise((t,a)=>{let o=!1,s=()=>{clearTimeout(u),i?.removeEventListener(`abort`,l)},c=e=>{o||(o=!0,s(),e())},l=()=>{i!==void 0&&c(()=>{a(S(i))})},u=setTimeout(()=>{c(()=>{a(Error(n.message??`The operation exceeded ${r} ms.`))})},r);i?.addEventListener(`abort`,l,{once:!0}),Promise.resolve(e).then(e=>{c(()=>{t(e)})},e=>{c(()=>{a(e)})})})}async function D(e,t={}){let n=t.attempts??3,r=w(t.delayMs??200,`delayMs`),i=w(t.maxDelayMs??3e4,`maxDelayMs`),a=t.factor??2;if(!Number.isSafeInteger(n)||n<=0)throw RangeError(`attempts must be a positive safe integer.`);if(!Number.isFinite(a)||a<1)throw RangeError(`factor must be a finite number greater than or equal to 1.`);for(let o=1;o<=n;o+=1){C(t.signal);let s=t.signal===void 0?{attempt:o}:{attempt:o,signal:t.signal};try{return await e(s)}catch(e){if(o===n||t.shouldRetry!==void 0&&!await t.shouldRetry(e,s))throw e;await T(r===0?0:Math.min(r*a**(o-1),i),t.signal===void 0?{}:{signal:t.signal})}}throw Error(`Retry finished without a result.`)}async function O(e,t,n,r={}){if(!Number.isSafeInteger(t)||t<=0)throw RangeError(`concurrency must be a positive safe integer.`);C(r.signal);let i=Array(e.length),a=0,o=!1,s=async()=>{for(;!o;){C(r.signal);let t=a;if(t>=e.length)return;if(a+=1,t in e)try{i[t]=await n(e[t],t,r.signal)}catch(e){throw o=!0,e}}},c=Math.min(t,e.length);return await Promise.all(Array.from({length:c},()=>s())),i}function k(e,t=300){let n=w(t,`delayMs`),r,i,a=[],o=async()=>{let t=i;if(t===void 0)throw Error(`No debounced invocation is pending.`);i=void 0,r=void 0;let n=a;a=[];try{let r=await e(...t);return n.forEach(e=>{e.resolve(r)}),r}catch(e){throw n.forEach(t=>{t.reject(e)}),e}},s=(...e)=>(i=e,r!==void 0&&clearTimeout(r),r=setTimeout(()=>{o().catch(()=>void 0)},n),new Promise((e,t)=>a.push({reject:t,resolve:e})));return s.cancel=e=>{r!==void 0&&clearTimeout(r),r=void 0,i=void 0;let t=e??Error(`The debounced invocation was cancelled.`);a.forEach(e=>{e.reject(t)}),a=[]},s.flush=()=>{if(r!==void 0)return clearTimeout(r),o()},s.pending=()=>r!==void 0,s}function A(e,t=300){let n=w(t,`delayMs`),r,i,a=!1,o=!1,s=()=>{!a&&o&&(i=void 0)},c=(...t)=>{if(i!==void 0)return i;a=!0,o=!1;let c;try{c=Promise.resolve(e(...t))}catch(e){c=Promise.reject(e)}return i=c,c.then(()=>{o=!0,s()},()=>{o=!0,s()}),r=setTimeout(()=>{r=void 0,a=!1,s()},n),c};return c.cancel=()=>{r!==void 0&&clearTimeout(r),r=void 0,a=!1,s()},c.pending=()=>i!==void 0,c}let ee=globalThis,te=()=>{let e=ee.TextDecoder;if(typeof e!=`function`)throw Error(`TextDecoder is unavailable in the current runtime.`);return new e(`utf-8`,{fatal:!0})},ne=()=>{let e=ee.TextEncoder;if(typeof e!=`function`)throw Error(`TextEncoder is unavailable in the current runtime.`);return new e},j=e=>ne().encode(e),re=[`B`,`kB`,`MB`,`GB`,`TB`,`PB`,`EB`,`ZB`,`YB`],ie=[`B`,`KiB`,`MiB`,`GiB`,`TiB`,`PiB`,`EiB`,`ZiB`,`YiB`],ae=globalThis,M=(e,t)=>{if(Number.isNaN(e))throw RangeError(`${t} cannot be NaN.`)},N=(e,t)=>{if(!Number.isFinite(e))throw RangeError(`${t} must be finite.`)},oe=(e,t)=>{if(Object.is(e,-0))return-0;let[n=`0`,r=`0`]=e.toString().split(`e`);return Number(`${n}e${Number(r)+t}`)};function se(e,t,n){if(M(e,`value`),M(t,`minimum`),M(n,`maximum`),t>n)throw RangeError(`minimum cannot be greater than maximum.`);return Math.min(Math.max(e,t),n)}function ce(e,t,n,r=!1){if(M(e,`value`),M(t,`minimum`),M(n,`maximum`),t>n)throw RangeError(`minimum cannot be greater than maximum.`);return e>=t&&(r?e<=n:e<n)}function le(e,t=0){if(N(e,`value`),!Number.isSafeInteger(t)||t<-15||t>15)throw RangeError(`digits must be a safe integer between -15 and 15.`);let n=oe(e,t);return Number.isFinite(n)?oe(Math.round(n),-t):e}function ue(e){let t=0,n=0;return e.forEach(e=>{N(e,`value`);let r=e-n,i=t+r;if(!Number.isFinite(i))throw RangeError(`The sum exceeds the finite number range.`);n=i-t-r,t=i}),t}function de(e){let t=0,n=0;return e.forEach(e=>{N(e,`value`),t+=1,n=n*((t-1)/t)+e/t}),t===0?void 0:n}function fe(e,t,n){N(e,`start`),N(t,`end`),N(n,`amount`);let r=e*(1-n)+t*n;if(!Number.isFinite(r))throw RangeError(`The interpolation result exceeds the finite number range.`);return r}function pe(e,t={}){if(N(e,`bytes`),e<0)throw RangeError(`bytes cannot be negative.`);let n=t.base??1024;if(n!==1e3&&n!==1024)throw RangeError(`base must be 1000 or 1024.`);let r=n,i=t.decimals??2;if(!Number.isSafeInteger(i)||i<0||i>20)throw RangeError(`decimals must be a safe integer between 0 and 20.`);if(e===0)return`0 B`;let a=r===1024?ie:re,o=Math.min(Math.floor(Math.log(e)/Math.log(r)),a.length-1),s=e/r**o;return`${new Intl.NumberFormat(t.locale??`en-US`,{maximumFractionDigits:i,minimumFractionDigits:0,useGrouping:!1}).format(s)} ${a[o]??a.at(-1)}`}function me(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t))throw RangeError(`minimum and maximumExclusive must be safe integers.`);let n=t-e,r=4294967296;if(n<=0||n>r)throw RangeError(`The interval must be non-empty and no wider than 2^32.`);let i=ae.crypto;if(typeof i?.getRandomValues!=`function`)throw Error(`Web Crypto random generation is unavailable in the current runtime.`);let a=Math.floor(r/n)*n,o=new Uint32Array(1),s;do i.getRandomValues(o),s=o[0]??r;while(s>=a);return e+s%n}let P=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,he=e=>TypeError(`The value is not valid ${e===`url`?`Base64URL`:`Base64`}.`),ge=(e,t)=>{let n=t===`standard`?e.replace(/[\t\n\f\r ]+/gu,``):e;if(!(t===`url`?/^[\w-]*={0,2}$/u:/^[A-Za-z\d+/]*={0,2}$/u).test(n)||n.length%4==1||n.includes(`=`)&&n.length%4!=0)throw he(t);let r=(t===`url`?n.replace(/-/gu,`+`).replace(/_/gu,`/`):n).replace(/=+$/u,``);return r.padEnd(Math.ceil(r.length/4)*4,`=`)},_e=e=>{let t=``;for(let n=0;n<e.length;n+=3){let r=e[n]??0,i=e[n+1],a=e[n+2],o=r<<16|(i??0)<<8|(a??0);t+=P[o>>18&63]??``,t+=P[o>>12&63]??``,t+=i===void 0?`=`:P[o>>6&63]??``,t+=a===void 0?`=`:P[o&63]??``}return t},ve=(e,t)=>{let n=ge(e,t);if(n.length===0)return new Uint8Array;let r=n.endsWith(`==`)?2:+!!n.endsWith(`=`),i=new Uint8Array(n.length/4*3-r),a=0;for(let e=0;e<n.length;e+=4){let o=P.indexOf(n[e]??``),s=P.indexOf(n[e+1]??``),c=n[e+2]??`=`,l=n[e+3]??`=`,u=c===`=`?0:P.indexOf(c),d=l===`=`?0:P.indexOf(l);if(o<0||s<0||u<0||d<0||e+4===n.length&&(r===2&&s&15||r===1&&u&3))throw he(t);let f=o<<18|s<<12|u<<6|d;a<i.length&&(i[a++]=f>>16&255),a<i.length&&(i[a++]=f>>8&255),a<i.length&&(i[a++]=f&255)}return i},ye=e=>{let t=te();try{return t.decode(e)}catch(e){throw TypeError(`The decoded bytes are not valid UTF-8.`,{cause:e})}};function F(e){return _e(e)}function I(e){return ve(e,`standard`)}function be(e){return _e(j(e))}function xe(e){return ye(I(e))}function L(e){return _e(e).replace(/\+/gu,`-`).replace(/\//gu,`_`).replace(/=+$/u,``)}function R(e){return ve(e,`url`)}function Se(e){return L(j(e))}function Ce(e){return ye(R(e))}function we(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1){let r=e.charCodeAt(n);if(r>255)throw TypeError(`The string to be encoded contains characters outside of the Latin-1 range.`);t[n]=r}return F(t)}function Te(e){let t=I(e),n=``;for(let e of t)n+=String.fromCharCode(e);return n}let Ee=Object.freeze([{index:977,randomIndex:188},{index:926,randomIndex:201},{index:851,randomIndex:225},{index:700,randomIndex:255},{index:600,randomIndex:268},{index:500,randomIndex:277},{index:400,randomIndex:288},{index:330,randomIndex:327},{index:300,randomIndex:180},{index:200,randomIndex:178},{index:100,randomIndex:124},{index:98,randomIndex:95},{index:92,randomIndex:90},{index:91,randomIndex:87},{index:88,randomIndex:84},{index:82,randomIndex:79},{index:78,randomIndex:71},{index:72,randomIndex:69},{index:68,randomIndex:66},{index:59,randomIndex:55},{index:48,randomIndex:43},{index:42,randomIndex:37},{index:36,randomIndex:30},{index:33,randomIndex:27},{index:24,randomIndex:20},{index:23,randomIndex:18},{index:21,randomIndex:16},{index:17,randomIndex:14},{index:13,randomIndex:9},{index:7,randomIndex:4},{index:5,randomIndex:3},{index:2,randomIndex:1}]),De=e=>{if(!Number.isSafeInteger(e)||e<0)throw RangeError(`prefixStrLength must be a non-negative safe integer.`)},Oe=e=>{let t=``;for(let n=0;n<e;n+=1)t+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`[me(0,52)]??``;return t},ke=e=>{let t=e;for(let n of Ee){if(n.index>=e.length)continue;let r=e[n.randomIndex]??e.at(-1)??``;t=t.slice(0,n.index)+r+t.slice(n.index)}return t},Ae=e=>{let t=e;for(let n=Ee.length-1;n>=0;--n){let r=Ee[n];r!==void 0&&r.index<e.length&&(t=t.slice(0,r.index)+t.slice(r.index+1))}return t};function je(e,t=6){if(e.length===0)return``;De(t);let n=Oe(t),r=we(encodeURIComponent(e));return t!==0&&(r=ke(r)),n+r}function Me(e,t=6){if(e.length===0)return``;if(De(t),t>e.length)throw TypeError(`The Base64 value is shorter than its configured prefix.`);let n=e.slice(t);return t!==0&&(n=Ae(n)),decodeURIComponent(Te(n))}let Ne=(e,t)=>{if(!Number.isFinite(e)||e<0||e>255)throw RangeError(`${t} must be a finite number from 0 through 255.`)},Pe=e=>{if(!Number.isFinite(e)||e<0||e>1)throw RangeError(`alpha must be a finite number from 0 through 1.`)},Fe=e=>{let t=e.startsWith(`#`)?e.slice(1):e;if(![3,4,6,8].includes(t.length)||!/^[\dA-F]+$/iu.test(t))throw TypeError(`Expected a 3, 4, 6, or 8 digit hexadecimal color.`);return t.length<=4?Array.from(t,e=>`${e}${e}`).join(``):t},Ie=e=>Math.round(e).toString(16).padStart(2,`0`);function Le(e){let t=Fe(e);return{red:Number.parseInt(t.slice(0,2),16),green:Number.parseInt(t.slice(2,4),16),blue:Number.parseInt(t.slice(4,6),16),alpha:t.length===8?Number.parseInt(t.slice(6,8),16)/255:1}}function Re(e,t=`alpha`in e&&e.alpha<1){Ne(e.red,`red`),Ne(e.green,`green`),Ne(e.blue,`blue`);let n=`alpha`in e?e.alpha:1;return Pe(n),`#${`${Ie(e.red)}${Ie(e.green)}${Ie(e.blue)}`}${t?Ie(n*255):``}`}function ze(e,t,n){if(!Number.isFinite(n)||n<0||n>1)throw RangeError(`amount must be a finite number from 0 through 1.`);let r=Le(e),i=Le(t),a=(e,t)=>e+(t-e)*n;return Re({red:a(r.red,i.red),green:a(r.green,i.green),blue:a(r.blue,i.blue),alpha:a(r.alpha,i.alpha)},r.alpha<1||i.alpha<1)}function Be(e,t){return ze(e,`#000000`,t)}function Ve(e,t){return ze(e,`#ffffff`,t)}let He=e=>{let t=e/255;return t<=.04045?t/12.92:((t+.055)/1.055)**2.4};function Ue(e){let{red:t,green:n,blue:r}=Le(e);return .2126*He(t)+.7152*He(n)+.0722*He(r)}function We(e,t){let n=Ue(e),r=Ue(t),i=Math.max(n,r),a=Math.min(n,r);return(i+.05)/(a+.05)}function Ge(e,t=`#000000`,n=`#ffffff`){return We(e,t)>=We(e,n)?t:n}var Ke=c((()=>{})),z=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r():typeof define==`function`&&define.amd?define([],r):n.CryptoJS=r()})(e,function(){var e=e||function(e,t){var n;if(typeof window<`u`&&window.crypto&&(n=window.crypto),typeof self<`u`&&self.crypto&&(n=self.crypto),typeof globalThis<`u`&&globalThis.crypto&&(n=globalThis.crypto),!n&&typeof window<`u`&&window.msCrypto&&(n=window.msCrypto),!n&&typeof global<`u`&&global.crypto&&(n=global.crypto),!n&&typeof require==`function`)try{n=Ke()}catch{}var r=function(){if(n){if(typeof n.getRandomValues==`function`)try{return n.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof n.randomBytes==`function`)try{return n.randomBytes(4).readInt32LE()}catch{}}throw Error(`Native crypto module could not be used to get secure random number.`)},i=Object.create||function(){function e(){}return function(t){var n;return e.prototype=t,n=new e,e.prototype=null,n}}(),a={},o=a.lib={},s=o.Base=function(){return{extend:function(e){var t=i(this);return e&&t.mixIn(e),(!t.hasOwnProperty(`init`)||this.init===t.init)&&(t.init=function(){t.$super.init.apply(this,arguments)}),t.init.prototype=t,t.$super=this,t},create:function(){var e=this.extend();return e.init.apply(e,arguments),e},init:function(){},mixIn:function(e){for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);e.hasOwnProperty(`toString`)&&(this.toString=e.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),c=o.WordArray=s.extend({init:function(e,n){e=this.words=e||[],this.sigBytes=n==t?e.length*4:n},toString:function(e){return(e||u).stringify(this)},concat:function(e){var t=this.words,n=e.words,r=this.sigBytes,i=e.sigBytes;if(this.clamp(),r%4)for(var a=0;a<i;a++){var o=n[a>>>2]>>>24-a%4*8&255;t[r+a>>>2]|=o<<24-(r+a)%4*8}else for(var s=0;s<i;s+=4)t[r+s>>>2]=n[s>>>2];return this.sigBytes+=i,this},clamp:function(){var t=this.words,n=this.sigBytes;t[n>>>2]&=4294967295<<32-n%4*8,t.length=e.ceil(n/4)},clone:function(){var e=s.clone.call(this);return e.words=this.words.slice(0),e},random:function(e){for(var t=[],n=0;n<e;n+=4)t.push(r());return new c.init(t,e)}}),l=a.enc={},u=l.Hex={stringify:function(e){for(var t=e.words,n=e.sigBytes,r=[],i=0;i<n;i++){var a=t[i>>>2]>>>24-i%4*8&255;r.push((a>>>4).toString(16)),r.push((a&15).toString(16))}return r.join(``)},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r+=2)n[r>>>3]|=parseInt(e.substr(r,2),16)<<24-r%8*4;return new c.init(n,t/2)}},d=l.Latin1={stringify:function(e){for(var t=e.words,n=e.sigBytes,r=[],i=0;i<n;i++){var a=t[i>>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(a))}return r.join(``)},parse:function(e){for(var t=e.length,n=[],r=0;r<t;r++)n[r>>>2]|=(e.charCodeAt(r)&255)<<24-r%4*8;return new c.init(n,t)}},f=l.Utf8={stringify:function(e){try{return decodeURIComponent(escape(d.stringify(e)))}catch{throw Error(`Malformed UTF-8 data`)}},parse:function(e){return d.parse(unescape(encodeURIComponent(e)))}},p=o.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(e){typeof e==`string`&&(e=f.parse(e)),this._data.concat(e),this._nDataBytes+=e.sigBytes},_process:function(t){var n,r=this._data,i=r.words,a=r.sigBytes,o=this.blockSize,s=a/(o*4);s=t?e.ceil(s):e.max((s|0)-this._minBufferSize,0);var l=s*o,u=e.min(l*4,a);if(l){for(var d=0;d<l;d+=o)this._doProcessBlock(i,d);n=i.splice(0,l),r.sigBytes-=u}return new c.init(n,u)},clone:function(){var e=s.clone.call(this);return e._data=this._data.clone(),e},_minBufferSize:0});o.Hasher=p.extend({cfg:s.extend(),init:function(e){this.cfg=this.cfg.extend(e),this.reset()},reset:function(){p.reset.call(this),this._doReset()},update:function(e){return this._append(e),this._process(),this},finalize:function(e){return e&&this._append(e),this._doFinalize()},blockSize:512/32,_createHelper:function(e){return function(t,n){return new e.init(n).finalize(t)}},_createHmacHelper:function(e){return function(t,n){return new m.HMAC.init(e,n).finalize(t)}}});var m=a.algo={};return a}(Math);return e})})),qe=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r(z()):typeof define==`function`&&define.amd?define([`./core`],r):r(n.CryptoJS)})(e,function(e){return(function(){var t=e,n=t.lib.WordArray,r=t.enc;r.Base64={stringify:function(e){var t=e.words,n=e.sigBytes,r=this._map;e.clamp();for(var i=[],a=0;a<n;a+=3)for(var o=t[a>>>2]>>>24-a%4*8&255,s=t[a+1>>>2]>>>24-(a+1)%4*8&255,c=t[a+2>>>2]>>>24-(a+2)%4*8&255,l=o<<16|s<<8|c,u=0;u<4&&a+u*.75<n;u++)i.push(r.charAt(l>>>6*(3-u)&63));var d=r.charAt(64);if(d)for(;i.length%4;)i.push(d);return i.join(``)},parse:function(e){var t=e.length,n=this._map,r=this._reverseMap;if(!r){r=this._reverseMap=[];for(var a=0;a<n.length;a++)r[n.charCodeAt(a)]=a}var o=n.charAt(64);if(o){var s=e.indexOf(o);s!==-1&&(t=s)}return i(e,t,r)},_map:`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=`};function i(e,t,r){for(var i=[],a=0,o=0;o<t;o++)if(o%4){var s=r[e.charCodeAt(o-1)]<<o%4*2|r[e.charCodeAt(o)]>>>6-o%4*2;i[a>>>2]|=s<<24-a%4*8,a++}return n.create(i,a)}})(),e.enc.Base64})})),Je=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r(z()):typeof define==`function`&&define.amd?define([`./core`],r):r(n.CryptoJS)})(e,function(e){return(function(t){var n=e,r=n.lib,i=r.WordArray,a=r.Hasher,o=n.algo,s=[];(function(){for(var e=0;e<64;e++)s[e]=t.abs(t.sin(e+1))*4294967296|0})();var c=o.MD5=a.extend({_doReset:function(){this._hash=new i.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(e,t){for(var n=0;n<16;n++){var r=t+n,i=e[r];e[r]=(i<<8|i>>>24)&16711935|(i<<24|i>>>8)&4278255360}var a=this._hash.words,o=e[t+0],c=e[t+1],p=e[t+2],m=e[t+3],h=e[t+4],g=e[t+5],_=e[t+6],v=e[t+7],y=e[t+8],b=e[t+9],x=e[t+10],S=e[t+11],C=e[t+12],w=e[t+13],T=e[t+14],E=e[t+15],D=a[0],O=a[1],k=a[2],A=a[3];D=l(D,O,k,A,o,7,s[0]),A=l(A,D,O,k,c,12,s[1]),k=l(k,A,D,O,p,17,s[2]),O=l(O,k,A,D,m,22,s[3]),D=l(D,O,k,A,h,7,s[4]),A=l(A,D,O,k,g,12,s[5]),k=l(k,A,D,O,_,17,s[6]),O=l(O,k,A,D,v,22,s[7]),D=l(D,O,k,A,y,7,s[8]),A=l(A,D,O,k,b,12,s[9]),k=l(k,A,D,O,x,17,s[10]),O=l(O,k,A,D,S,22,s[11]),D=l(D,O,k,A,C,7,s[12]),A=l(A,D,O,k,w,12,s[13]),k=l(k,A,D,O,T,17,s[14]),O=l(O,k,A,D,E,22,s[15]),D=u(D,O,k,A,c,5,s[16]),A=u(A,D,O,k,_,9,s[17]),k=u(k,A,D,O,S,14,s[18]),O=u(O,k,A,D,o,20,s[19]),D=u(D,O,k,A,g,5,s[20]),A=u(A,D,O,k,x,9,s[21]),k=u(k,A,D,O,E,14,s[22]),O=u(O,k,A,D,h,20,s[23]),D=u(D,O,k,A,b,5,s[24]),A=u(A,D,O,k,T,9,s[25]),k=u(k,A,D,O,m,14,s[26]),O=u(O,k,A,D,y,20,s[27]),D=u(D,O,k,A,w,5,s[28]),A=u(A,D,O,k,p,9,s[29]),k=u(k,A,D,O,v,14,s[30]),O=u(O,k,A,D,C,20,s[31]),D=d(D,O,k,A,g,4,s[32]),A=d(A,D,O,k,y,11,s[33]),k=d(k,A,D,O,S,16,s[34]),O=d(O,k,A,D,T,23,s[35]),D=d(D,O,k,A,c,4,s[36]),A=d(A,D,O,k,h,11,s[37]),k=d(k,A,D,O,v,16,s[38]),O=d(O,k,A,D,x,23,s[39]),D=d(D,O,k,A,w,4,s[40]),A=d(A,D,O,k,o,11,s[41]),k=d(k,A,D,O,m,16,s[42]),O=d(O,k,A,D,_,23,s[43]),D=d(D,O,k,A,b,4,s[44]),A=d(A,D,O,k,C,11,s[45]),k=d(k,A,D,O,E,16,s[46]),O=d(O,k,A,D,p,23,s[47]),D=f(D,O,k,A,o,6,s[48]),A=f(A,D,O,k,v,10,s[49]),k=f(k,A,D,O,T,15,s[50]),O=f(O,k,A,D,g,21,s[51]),D=f(D,O,k,A,C,6,s[52]),A=f(A,D,O,k,m,10,s[53]),k=f(k,A,D,O,x,15,s[54]),O=f(O,k,A,D,c,21,s[55]),D=f(D,O,k,A,y,6,s[56]),A=f(A,D,O,k,E,10,s[57]),k=f(k,A,D,O,_,15,s[58]),O=f(O,k,A,D,w,21,s[59]),D=f(D,O,k,A,h,6,s[60]),A=f(A,D,O,k,S,10,s[61]),k=f(k,A,D,O,p,15,s[62]),O=f(O,k,A,D,b,21,s[63]),a[0]=a[0]+D|0,a[1]=a[1]+O|0,a[2]=a[2]+k|0,a[3]=a[3]+A|0},_doFinalize:function(){var e=this._data,n=e.words,r=this._nDataBytes*8,i=e.sigBytes*8;n[i>>>5]|=128<<24-i%32;var a=t.floor(r/4294967296),o=r;n[(i+64>>>9<<4)+15]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,n[(i+64>>>9<<4)+14]=(o<<8|o>>>24)&16711935|(o<<24|o>>>8)&4278255360,e.sigBytes=(n.length+1)*4,this._process();for(var s=this._hash,c=s.words,l=0;l<4;l++){var u=c[l];c[l]=(u<<8|u>>>24)&16711935|(u<<24|u>>>8)&4278255360}return s},clone:function(){var e=a.clone.call(this);return e._hash=this._hash.clone(),e}});function l(e,t,n,r,i,a,o){var s=e+(t&n|~t&r)+i+o;return(s<<a|s>>>32-a)+t}function u(e,t,n,r,i,a,o){var s=e+(t&r|n&~r)+i+o;return(s<<a|s>>>32-a)+t}function d(e,t,n,r,i,a,o){var s=e+(t^n^r)+i+o;return(s<<a|s>>>32-a)+t}function f(e,t,n,r,i,a,o){var s=e+(n^(t|~r))+i+o;return(s<<a|s>>>32-a)+t}n.MD5=a._createHelper(c),n.HmacMD5=a._createHmacHelper(c)})(Math),e.MD5})})),Ye=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r(z()):typeof define==`function`&&define.amd?define([`./core`],r):r(n.CryptoJS)})(e,function(e){return(function(){var t=e,n=t.lib,r=n.WordArray,i=n.Hasher,a=t.algo,o=[],s=a.SHA1=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,t){for(var n=this._hash.words,r=n[0],i=n[1],a=n[2],s=n[3],c=n[4],l=0;l<80;l++){if(l<16)o[l]=e[t+l]|0;else{var u=o[l-3]^o[l-8]^o[l-14]^o[l-16];o[l]=u<<1|u>>>31}var d=(r<<5|r>>>27)+c+o[l];d+=l<20?(i&a|~i&s)+1518500249:l<40?(i^a^s)+1859775393:l<60?(i&a|i&s|a&s)-1894007588:(i^a^s)-899497514,c=s,s=a,a=i<<30|i>>>2,i=r,r=d}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+a|0,n[3]=n[3]+s|0,n[4]=n[4]+c|0},_doFinalize:function(){var e=this._data,t=e.words,n=this._nDataBytes*8,r=e.sigBytes*8;return t[r>>>5]|=128<<24-r%32,t[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),t[(r+64>>>9<<4)+15]=n,e.sigBytes=t.length*4,this._process(),this._hash},clone:function(){var e=i.clone.call(this);return e._hash=this._hash.clone(),e}});t.SHA1=i._createHelper(s),t.HmacSHA1=i._createHmacHelper(s)})(),e.SHA1})})),Xe=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r(z()):typeof define==`function`&&define.amd?define([`./core`],r):r(n.CryptoJS)})(e,function(e){(function(){var t=e,n=t.lib.Base,r=t.enc.Utf8,i=t.algo;i.HMAC=n.extend({init:function(e,t){e=this._hasher=new e.init,typeof t==`string`&&(t=r.parse(t));var n=e.blockSize,i=n*4;t.sigBytes>i&&(t=e.finalize(t)),t.clamp();for(var a=this._oKey=t.clone(),o=this._iKey=t.clone(),s=a.words,c=o.words,l=0;l<n;l++)s[l]^=1549556828,c[l]^=909522486;a.sigBytes=o.sigBytes=i,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var t=this._hasher,n=t.finalize(e);return t.reset(),t.finalize(this._oKey.clone().concat(n))}})})()})})),Ze=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),Ye(),Xe()):typeof define==`function`&&define.amd?define([`./core`,`./sha1`,`./hmac`],r):r(n.CryptoJS)})(e,function(e){return(function(){var t=e,n=t.lib,r=n.Base,i=n.WordArray,a=t.algo,o=a.MD5,s=a.EvpKDF=r.extend({cfg:r.extend({keySize:128/32,hasher:o,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var n,r=this.cfg,a=r.hasher.create(),o=i.create(),s=o.words,c=r.keySize,l=r.iterations;s.length<c;){n&&a.update(n),n=a.update(e).finalize(t),a.reset();for(var u=1;u<l;u++)n=a.finalize(n),a.reset();o.concat(n)}return o.sigBytes=c*4,o}});t.EvpKDF=function(e,t,n){return s.create(n).compute(e,t)}})(),e.EvpKDF})})),B=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),Ze()):typeof define==`function`&&define.amd?define([`./core`,`./evpkdf`],r):r(n.CryptoJS)})(e,function(e){e.lib.Cipher||function(t){var n=e,r=n.lib,i=r.Base,a=r.WordArray,o=r.BufferedBlockAlgorithm,s=n.enc;s.Utf8;var c=s.Base64,l=n.algo.EvpKDF,u=r.Cipher=o.extend({cfg:i.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,n){this.cfg=this.cfg.extend(n),this._xformMode=e,this._key=t,this.reset()},reset:function(){o.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){return e&&this._append(e),this._doFinalize()},keySize:128/32,ivSize:128/32,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return typeof e==`string`?S:y}return function(t){return{encrypt:function(n,r,i){return e(r).encrypt(t,n,r,i)},decrypt:function(n,r,i){return e(r).decrypt(t,n,r,i)}}}}()});r.StreamCipher=u.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var d=n.mode={},f=r.BlockCipherMode=i.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),p=d.CBC=function(){var e=f.extend();e.Encryptor=e.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize;n.call(this,e,t,i),r.encryptBlock(e,t),this._prevBlock=e.slice(t,t+i)}}),e.Decryptor=e.extend({processBlock:function(e,t){var r=this._cipher,i=r.blockSize,a=e.slice(t,t+i);r.decryptBlock(e,t),n.call(this,e,t,i),this._prevBlock=a}});function n(e,n,r){var i,a=this._iv;a?(i=a,this._iv=t):i=this._prevBlock;for(var o=0;o<r;o++)e[n+o]^=i[o]}return e}(),m=n.pad={},h=m.Pkcs7={pad:function(e,t){for(var n=t*4,r=n-e.sigBytes%n,i=r<<24|r<<16|r<<8|r,o=[],s=0;s<r;s+=4)o.push(i);var c=a.create(o,r);e.concat(c)},unpad:function(e){var t=e.words[e.sigBytes-1>>>2]&255;e.sigBytes-=t}};r.BlockCipher=u.extend({cfg:u.cfg.extend({mode:p,padding:h}),reset:function(){var e;u.reset.call(this);var t=this.cfg,n=t.iv,r=t.mode;this._xformMode==this._ENC_XFORM_MODE?e=r.createEncryptor:(e=r.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==e?this._mode.init(this,n&&n.words):(this._mode=e.call(r,this,n&&n.words),this._mode.__creator=e)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e,t=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(t.pad(this._data,this.blockSize),e=this._process(!0)):(e=this._process(!0),t.unpad(e)),e},blockSize:128/32});var g=r.CipherParams=i.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}}),_=n.format={},v=_.OpenSSL={stringify:function(e){var t,n=e.ciphertext,r=e.salt;return t=r?a.create([1398893684,1701076831]).concat(r).concat(n):n,t.toString(c)},parse:function(e){var t,n=c.parse(e),r=n.words;return r[0]==1398893684&&r[1]==1701076831&&(t=a.create(r.slice(2,4)),r.splice(0,4),n.sigBytes-=16),g.create({ciphertext:n,salt:t})}},y=r.SerializableCipher=i.extend({cfg:i.extend({format:v}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=e.createEncryptor(n,r),a=i.finalize(t),o=i.cfg;return g.create({ciphertext:a,key:n,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:r.format})},decrypt:function(e,t,n,r){return r=this.cfg.extend(r),t=this._parse(t,r.format),e.createDecryptor(n,r).finalize(t.ciphertext)},_parse:function(e,t){return typeof e==`string`?t.parse(e,this):e}}),b=n.kdf={},x=b.OpenSSL={execute:function(e,t,n,r,i){if(r||=a.random(64/8),i)var o=l.create({keySize:t+n,hasher:i}).compute(e,r);else var o=l.create({keySize:t+n}).compute(e,r);var s=a.create(o.words.slice(t),n*4);return o.sigBytes=t*4,g.create({key:o,iv:s,salt:r})}},S=r.PasswordBasedCipher=y.extend({cfg:y.cfg.extend({kdf:x}),encrypt:function(e,t,n,r){r=this.cfg.extend(r);var i=r.kdf.execute(n,e.keySize,e.ivSize,r.salt,r.hasher);r.iv=i.iv;var a=y.encrypt.call(this,e,t,i.key,r);return a.mixIn(i),a},decrypt:function(e,t,n,r){r=this.cfg.extend(r),t=this._parse(t,r.format);var i=r.kdf.execute(n,e.keySize,e.ivSize,t.salt,r.hasher);return r.iv=i.iv,y.decrypt.call(this,e,t,i.key,r)}})}()})})),Qe=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),qe(),Je(),Ze(),B()):typeof define==`function`&&define.amd?define([`./core`,`./enc-base64`,`./md5`,`./evpkdf`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return(function(){var t=e,n=t.lib.BlockCipher,r=t.algo,i=[],a=[],o=[],s=[],c=[],l=[],u=[],d=[],f=[],p=[];(function(){for(var e=[],t=0;t<256;t++)t<128?e[t]=t<<1:e[t]=t<<1^283;for(var n=0,r=0,t=0;t<256;t++){var m=r^r<<1^r<<2^r<<3^r<<4;m=m>>>8^m&255^99,i[n]=m,a[m]=n;var h=e[n],g=e[h],_=e[g],v=e[m]*257^m*16843008;o[n]=v<<24|v>>>8,s[n]=v<<16|v>>>16,c[n]=v<<8|v>>>24,l[n]=v;var v=_*16843009^g*65537^h*257^n*16843008;u[m]=v<<24|v>>>8,d[m]=v<<16|v>>>16,f[m]=v<<8|v>>>24,p[m]=v,n?(n=h^e[e[e[_^h]]],r^=e[e[r]]):n=r=1}})();var m=[0,1,2,4,8,16,32,64,128,27,54],h=r.AES=n.extend({_doReset:function(){var e;if(!(this._nRounds&&this._keyPriorReset===this._key)){for(var t=this._keyPriorReset=this._key,n=t.words,r=t.sigBytes/4,a=((this._nRounds=r+6)+1)*4,o=this._keySchedule=[],s=0;s<a;s++)s<r?o[s]=n[s]:(e=o[s-1],s%r?r>6&&s%r==4&&(e=i[e>>>24]<<24|i[e>>>16&255]<<16|i[e>>>8&255]<<8|i[e&255]):(e=e<<8|e>>>24,e=i[e>>>24]<<24|i[e>>>16&255]<<16|i[e>>>8&255]<<8|i[e&255],e^=m[s/r|0]<<24),o[s]=o[s-r]^e);for(var c=this._invKeySchedule=[],l=0;l<a;l++){var s=a-l;if(l%4)var e=o[s];else var e=o[s-4];l<4||s<=4?c[l]=e:c[l]=u[i[e>>>24]]^d[i[e>>>16&255]]^f[i[e>>>8&255]]^p[i[e&255]]}}},encryptBlock:function(e,t){this._doCryptBlock(e,t,this._keySchedule,o,s,c,l,i)},decryptBlock:function(e,t){var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n,this._doCryptBlock(e,t,this._invKeySchedule,u,d,f,p,a);var n=e[t+1];e[t+1]=e[t+3],e[t+3]=n},_doCryptBlock:function(e,t,n,r,i,a,o,s){for(var c=this._nRounds,l=e[t]^n[0],u=e[t+1]^n[1],d=e[t+2]^n[2],f=e[t+3]^n[3],p=4,m=1;m<c;m++){var h=r[l>>>24]^i[u>>>16&255]^a[d>>>8&255]^o[f&255]^n[p++],g=r[u>>>24]^i[d>>>16&255]^a[f>>>8&255]^o[l&255]^n[p++],_=r[d>>>24]^i[f>>>16&255]^a[l>>>8&255]^o[u&255]^n[p++],v=r[f>>>24]^i[l>>>16&255]^a[u>>>8&255]^o[d&255]^n[p++];l=h,u=g,d=_,f=v}var h=(s[l>>>24]<<24|s[u>>>16&255]<<16|s[d>>>8&255]<<8|s[f&255])^n[p++],g=(s[u>>>24]<<24|s[d>>>16&255]<<16|s[f>>>8&255]<<8|s[l&255])^n[p++],_=(s[d>>>24]<<24|s[f>>>16&255]<<16|s[l>>>8&255]<<8|s[u&255])^n[p++],v=(s[f>>>24]<<24|s[l>>>16&255]<<16|s[u>>>8&255]<<8|s[d&255])^n[p++];e[t]=h,e[t+1]=g,e[t+2]=_,e[t+3]=v},keySize:256/32});t.AES=n._createHelper(h)})(),e.AES})})),$e=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r(z()):typeof define==`function`&&define.amd?define([`./core`],r):r(n.CryptoJS)})(e,function(e){return e.enc.Hex})})),et=c(((e,t)=>{(function(n,r){typeof e==`object`?t.exports=e=r(z()):typeof define==`function`&&define.amd?define([`./core`],r):r(n.CryptoJS)})(e,function(e){return e.enc.Utf8})})),tt=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),B()):typeof define==`function`&&define.amd?define([`./core`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return e.mode.ECB=function(){var t=e.lib.BlockCipherMode.extend();return t.Encryptor=t.extend({processBlock:function(e,t){this._cipher.encryptBlock(e,t)}}),t.Decryptor=t.extend({processBlock:function(e,t){this._cipher.decryptBlock(e,t)}}),t}(),e.mode.ECB})})),nt=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),B()):typeof define==`function`&&define.amd?define([`./core`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return e.pad.AnsiX923={pad:function(e,t){var n=e.sigBytes,r=t*4,i=r-n%r,a=n+i-1;e.clamp(),e.words[a>>>2]|=i<<24-a%4*8,e.sigBytes+=i},unpad:function(e){var t=e.words[e.sigBytes-1>>>2]&255;e.sigBytes-=t}},e.pad.Ansix923})})),rt=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),B()):typeof define==`function`&&define.amd?define([`./core`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return e.pad.Iso10126={pad:function(t,n){var r=n*4,i=r-t.sigBytes%r;t.concat(e.lib.WordArray.random(i-1)).concat(e.lib.WordArray.create([i<<24],1))},unpad:function(e){var t=e.words[e.sigBytes-1>>>2]&255;e.sigBytes-=t}},e.pad.Iso10126})})),it=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),B()):typeof define==`function`&&define.amd?define([`./core`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return e.pad.NoPadding={pad:function(){},unpad:function(){}},e.pad.NoPadding})})),at=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),B()):typeof define==`function`&&define.amd?define([`./core`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return e.pad.Pkcs7})})),ot=c(((e,t)=>{(function(n,r,i){typeof e==`object`?t.exports=e=r(z(),B()):typeof define==`function`&&define.amd?define([`./core`,`./cipher-core`],r):r(n.CryptoJS)})(e,function(e){return e.pad.ZeroPadding={pad:function(e,t){var n=t*4;e.clamp(),e.sigBytes+=n-(e.sigBytes%n||n)},unpad:function(e){for(var t=e.words,n=e.sigBytes-1,n=e.sigBytes-1;n>=0;n--)if(t[n>>>2]>>>24-n%4*8&255){e.sigBytes=n+1;break}}},e.pad.ZeroPadding})})),st=u(Qe(),1),ct=u(z(),1),lt=u($e(),1),V=u(et(),1),ut=u(Je(),1),dt=u(tt(),1);nt();var ft=u(rt(),1),pt=u(it(),1),mt=u(at(),1),ht=u(ot(),1),gt=u(Ye(),1);let _t=6e5,vt=1e5,yt=5e6,bt=1024,xt=8388608,St=`FAST-AES-256-GCM-V2`,Ct=`FAST-PBKDF2-SHA256-V1`,wt=globalThis,Tt=()=>{let e=wt.crypto;if(typeof e?.getRandomValues!=`function`)throw Error(`Web Crypto is unavailable in the current runtime.`);return e},H=()=>{let e=Tt(),t=e.subtle;if(typeof t?.decrypt!=`function`||typeof t.deriveBits!=`function`||typeof t.deriveKey!=`function`||typeof t.digest!=`function`||typeof t.encrypt!=`function`||typeof t.exportKey!=`function`||typeof t.generateKey!=`function`||typeof t.importKey!=`function`||typeof t.sign!=`function`||typeof t.verify!=`function`)throw Error(`Web Crypto SubtleCrypto is unavailable in the current runtime.`);return e},U=e=>{let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer},W={private:`PRIVATE KEY`,public:`PUBLIC KEY`},Et=(e,t)=>`-----BEGIN ${e}-----\n${F(new Uint8Array(t)).match(/.{1,64}/gu)?.join(`
2
+ `)??``}\n-----END ${e}-----`,G=(e,t)=>{let n=`-----BEGIN ${t}-----`,r=`-----END ${t}-----`,i=e.trim();if(!i.startsWith(n)||!i.endsWith(r))throw TypeError(`Expected a ${t} PEM value.`);let a=i.slice(n.length,-r.length).replace(/\s+/gu,``);return U(I(a))},Dt=async e=>{let t=H(),[n,r]=await Promise.all([t.subtle.exportKey(`pkcs8`,e.privateKey),t.subtle.exportKey(`spki`,e.publicKey)]);return{privateKey:Et(W.private,n),publicKey:Et(W.public,r)}},Ot=e=>{if(`privateKey`in e&&`publicKey`in e)return e;throw Error(`The runtime did not generate a key pair.`)},kt=e=>{let t=j(e);if(t.length===0)throw TypeError(`The encryption password cannot be empty.`);if(t.length>bt)throw RangeError(`The UTF-8 password cannot exceed ${bt} bytes.`);return t},At=e=>{if(!Number.isSafeInteger(e)||e<vt||e>yt)throw RangeError(`iterations must be a safe integer between ${vt} and ${yt}.`);return e},jt=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``),Mt=e=>jt(e).toUpperCase(),Nt=async(e,t,n)=>{let r=j(t);if(r.length===0)throw TypeError(`The HMAC key cannot be empty.`);let i=H(),a=await i.subtle.importKey(`raw`,U(r),{hash:n,name:`HMAC`},!1,[`sign`]),o=await i.subtle.sign(`HMAC`,a,U(j(e)));return new Uint8Array(o)};function K(e){if(!Number.isSafeInteger(e)||e<0||e>65536)throw RangeError(`length must be a safe integer from 0 through 65,536.`);return Tt().getRandomValues(new Uint8Array(e))}function Pt(e,t){let n=Math.max(e.length,t.length),r=e.length===t.length?0:1;for(let i=0;i<n;i+=1)r|=(e[i]??0)^(t[i]??0);return r===0}function Ft(e){return(0,ut.default)(e).toString(lt.default)}function It(e){return(0,gt.default)(e).toString(lt.default).toUpperCase()}async function Lt(e){let t=await H().subtle.digest(`SHA-256`,U(j(e)));return new Uint8Array(t)}async function Rt(e){return Mt(await Lt(e))}async function zt(e){let t=await H().subtle.digest(`SHA-384`,U(j(e)));return new Uint8Array(t)}async function Bt(e){return Mt(await zt(e))}async function Vt(e){let t=await H().subtle.digest(`SHA-512`,U(j(e)));return new Uint8Array(t)}async function Ht(e){return Mt(await Vt(e))}async function Ut(e,t){return jt(await Nt(e,t,`SHA-256`))}async function Wt(e,t){return jt(await Nt(e,t,`SHA-384`))}async function Gt(e,t){return jt(await Nt(e,t,`SHA-512`))}async function Kt(e,t,n=_t,r=32){let i=kt(e);if(t.length<8)throw RangeError(`The PBKDF2 salt must contain at least 8 bytes; 16 or more is recommended.`);if(!Number.isSafeInteger(r)||r<1||r>1024)throw RangeError(`outputLength must be a safe integer between 1 and 1,024.`);let a=H(),o=await a.subtle.importKey(`raw`,U(i),`PBKDF2`,!1,[`deriveBits`]),s=await a.subtle.deriveBits({hash:`SHA-256`,iterations:At(n),name:`PBKDF2`,salt:U(t)},o,r*8);return new Uint8Array(s)}async function qt(e,t=_t){let n=K(16),r=await Kt(e,n,t);return[Ct,String(t),L(n),L(r)].join(`:`)}async function Jt(e,t){try{let n=t.split(`:`);if(n.length!==4||n[0]!==Ct)return!1;let r=At(Number(n[1])),i=R(n[2]??``),a=R(n[3]??``);return i.length!==16||a.length!==32?!1:Pt(await Kt(e,i,r,a.length),a)}catch{return!1}}async function Yt(e,t=new Uint8Array,n=new Uint8Array,r=32){if(!Number.isSafeInteger(r)||r<1||r>8160)throw RangeError(`outputLength must be a safe integer between 1 and 8,160.`);let i=H(),a=await i.subtle.importKey(`raw`,U(e),`HKDF`,!1,[`deriveBits`]),o=await i.subtle.deriveBits({hash:`SHA-256`,info:U(n),name:`HKDF`,salt:U(t)},a,r*8);return new Uint8Array(o)}function Xt(e,t,n,r=`CBC`,i=`PKCS7`){if(e.trim().length===0||t.trim().length===0||n.trim().length===0)return null;if(r!==`CBC`&&r!==`ECB`)throw RangeError(`cipherMode must be "CBC" or "ECB".`);let a=mt.default;switch(i){case`None`:a=pt.default;break;case`PKCS7`:break;case`Zeros`:a=ht.default;break;case`ANSIX923`:a=ct.default.pad.AnsiX923;break;case`ISO10126`:a=ft.default;break;default:throw RangeError(`paddingMode is not supported.`)}if(i===`None`&&j(e).length%16!=0)throw RangeError(`AES plaintext must contain a whole number of 16-byte blocks when paddingMode is None.`);let o=V.default.parse(t.padEnd(32,`f`).slice(0,32)),s=V.default.parse(n.padEnd(16,`f`).slice(0,16));return st.default.encrypt(e,o,r===`CBC`?{iv:s,padding:a}:{iv:s,mode:dt.default,padding:a}).toString()}function Zt(e,t,n,r=`CBC`,i=`PKCS7`){if(e.trim().length===0||t.trim().length===0||n.trim().length===0)return null;if(r!==`CBC`&&r!==`ECB`)throw RangeError(`cipherMode must be "CBC" or "ECB".`);let a=mt.default;switch(i){case`None`:a=pt.default;break;case`PKCS7`:break;case`Zeros`:a=pt.default;break;case`ANSIX923`:a=ct.default.pad.AnsiX923;break;case`ISO10126`:a=ft.default;break;default:throw RangeError(`paddingMode is not supported.`)}let o=I(e);if(o.length===0||o.length%16!=0)throw RangeError(`AES ciphertext must contain one or more complete 16-byte blocks.`);let s=V.default.parse(t.padEnd(32,`f`).slice(0,32)),c=V.default.parse(n.padEnd(16,`f`).slice(0,16));return st.default.decrypt(e,s,r===`CBC`?{iv:c,padding:a}:{iv:c,mode:dt.default,padding:a}).toString(V.default)}async function Qt(e,t){if(t.trim().length===0)throw TypeError(`The encryption key cannot be empty.`);let n=H(),r=await Lt(t),i=await n.subtle.importKey(`raw`,U(r),{name:`AES-GCM`},!1,[`encrypt`]),a=K(12),o=new Uint8Array(await n.subtle.encrypt({iv:U(a),name:`AES-GCM`,tagLength:128},i,U(j(e)))),s=o.length-16,c=new Uint8Array(1+a.length+16+s);return c[0]=1,c.set(a,1),c.set(o.subarray(s),1+a.length),c.set(o.subarray(0,s),1+a.length+16),F(c)}async function $t(e,t){if(t.trim().length===0)throw TypeError(`The encryption key cannot be empty.`);let n=I(e);if(n.length<29||n[0]!==1)throw TypeError(`The AES-GCM payload format or version is not supported.`);let r=n.subarray(1,13),i=n.subarray(13,29),a=n.subarray(29),o=new Uint8Array(a.length+i.length);o.set(a),o.set(i,a.length);let s=H(),c=await Lt(t),l=await s.subtle.importKey(`raw`,U(c),{name:`AES-GCM`},!1,[`decrypt`]),u=await s.subtle.decrypt({iv:U(r),name:`AES-GCM`,tagLength:128},l,U(o));return te().decode(u)}async function en(e,t,n=_t){let r=kt(t),i=j(e);if(i.length>xt)throw RangeError(`The UTF-8 plaintext cannot exceed ${xt} bytes.`);let a=At(n),o=H(),s=K(16),c=K(12),l=await o.subtle.importKey(`raw`,U(r),`PBKDF2`,!1,[`deriveKey`]),u=await o.subtle.deriveKey({hash:`SHA-256`,iterations:a,name:`PBKDF2`,salt:U(s)},l,{length:256,name:`AES-GCM`},!1,[`encrypt`]),d=await o.subtle.encrypt({additionalData:U(j(St)),iv:U(c),name:`AES-GCM`,tagLength:128},u,i);return[St,String(a),L(s),L(c),L(new Uint8Array(d))].join(`:`)}async function tn(e,t){let n=kt(t);if(e.length>16777216)throw RangeError(`The encrypted payload exceeds the supported size.`);let r=e.split(`:`);if(r.length!==5||r[0]!==St)throw TypeError(`The encrypted payload format is not supported.`);let i,a,o,s;try{if(i=At(Number(r[1])),a=R(r[2]??``),o=R(r[3]??``),s=R(r[4]??``),a.length!==16||o.length!==12||s.length<16)throw TypeError(`The encrypted payload has invalid field lengths.`)}catch(e){throw TypeError(`The encrypted payload contains invalid fields.`,{cause:e})}let c=H(),l=te();try{let e=await c.subtle.importKey(`raw`,U(n),`PBKDF2`,!1,[`deriveKey`]),t=await c.subtle.deriveKey({hash:`SHA-256`,iterations:i,name:`PBKDF2`,salt:U(a)},e,{length:256,name:`AES-GCM`},!1,[`decrypt`]),r=await c.subtle.decrypt({additionalData:U(j(St)),iv:U(o),name:`AES-GCM`,tagLength:128},t,U(s));return l.decode(r)}catch(e){throw Error(`The payload could not be authenticated or decrypted.`,{cause:e})}}async function nn(e=2048){if(!Number.isSafeInteger(e)||e<2048||e%256!=0)throw RangeError(`modulusLength must be a safe integer of at least 2048 and divisible by 256.`);let t=H(),n=Ot(await t.subtle.generateKey({hash:`SHA-256`,modulusLength:e,name:`RSA-OAEP`,publicExponent:Uint8Array.of(1,0,1)},!0,[`decrypt`,`encrypt`]));return Dt(n)}async function rn(e,t){let n=H(),r=await n.subtle.importKey(`spki`,G(t,W.public),{hash:`SHA-256`,name:`RSA-OAEP`},!1,[`encrypt`]),i=await n.subtle.encrypt({name:`RSA-OAEP`},r,U(j(e)));return F(new Uint8Array(i))}async function an(e,t){let n=H(),r=await n.subtle.importKey(`pkcs8`,G(t,W.private),{hash:`SHA-256`,name:`RSA-OAEP`},!1,[`decrypt`]),i=await n.subtle.decrypt({name:`RSA-OAEP`},r,U(I(e)));return te().decode(i)}async function on(e,t){let n=H(),r=await n.subtle.importKey(`pkcs8`,G(t,W.private),{hash:`SHA-256`,name:`RSA-PSS`},!1,[`sign`]),i=await n.subtle.sign({name:`RSA-PSS`,saltLength:32},r,U(j(e)));return F(new Uint8Array(i))}async function sn(e,t,n){let r=H(),i=await r.subtle.importKey(`spki`,G(n,W.public),{hash:`SHA-256`,name:`RSA-PSS`},!1,[`verify`]);return r.subtle.verify({name:`RSA-PSS`,saltLength:32},i,U(I(t)),U(j(e)))}async function cn(e=`P-256`){let t=H(),n=Ot(await t.subtle.generateKey({name:`ECDSA`,namedCurve:e},!0,[`sign`,`verify`]));return Dt(n)}async function ln(e,t,n=`P-256`){let r=H(),i=await r.subtle.importKey(`pkcs8`,G(t,W.private),{name:`ECDSA`,namedCurve:n},!1,[`sign`]),a=n===`P-256`?`SHA-256`:n===`P-384`?`SHA-384`:`SHA-512`,o=await r.subtle.sign({hash:a,name:`ECDSA`},i,U(j(e)));return F(new Uint8Array(o))}async function un(e,t,n,r=`P-256`){let i=H(),a=await i.subtle.importKey(`spki`,G(n,W.public),{name:`ECDSA`,namedCurve:r},!1,[`verify`]),o=r===`P-256`?`SHA-256`:r===`P-384`?`SHA-384`:`SHA-512`;return i.subtle.verify({hash:o,name:`ECDSA`},a,U(I(t)),U(j(e)))}async function dn(e=`P-256`){let t=H(),n=Ot(await t.subtle.generateKey({name:`ECDH`,namedCurve:e},!0,[`deriveBits`]));return Dt(n)}async function fn(e,t,n=`P-256`){let r=H(),[i,a]=await Promise.all([r.subtle.importKey(`pkcs8`,G(e,W.private),{name:`ECDH`,namedCurve:n},!1,[`deriveBits`]),r.subtle.importKey(`spki`,G(t,W.public),{name:`ECDH`,namedCurve:n},!1,[])]),o=n===`P-256`?256:n===`P-384`?384:528,s=await r.subtle.deriveBits({name:`ECDH`,public:a},i,o);return new Uint8Array(s)}async function pn(e,t,n=`P-256`){let r=await fn(e,t,n),i=await H().subtle.digest(`SHA-256`,U(r));return new Uint8Array(i)}let mn=e=>{if(!Number.isSafeInteger(e))throw RangeError(`amount must be a safe integer.`)};function q(e){let t=e instanceof Date?new Date(e.getTime()):new Date(e);if(!Number.isFinite(t.getTime()))throw TypeError(`The value is not a valid date.`);return t}function hn(e){return e instanceof Date||typeof e==`number`||typeof e==`string`?Number.isFinite(new Date(e).getTime()):!1}function gn(e){let t=q(e);return t.setHours(0,0,0,0),q(t)}function _n(e){let t=q(e);return t.setHours(23,59,59,999),q(t)}function vn(e,t){mn(t);let n=q(e);return n.setDate(n.getDate()+t),q(n)}function yn(e,t){mn(t);let n=q(e),r=n.getDate();n.setDate(1),n.setMonth(n.getMonth()+t);let i=new Date(n.getTime());i.setMonth(i.getMonth()+1,0);let a=i.getDate();return n.setDate(Math.min(r,a)),q(n)}function bn(e,t){return mn(t),yn(e,t*12)}function xn(e,t){let n=q(e),r=q(t);return n.getFullYear()===r.getFullYear()&&n.getMonth()===r.getMonth()&&n.getDate()===r.getDate()}function Sn(e,t=Date.now()){return q(e).getTime()>q(t).getTime()}function Cn(e=Date.now()){return[gn(e),_n(e)]}function wn(e,t,n){let r=q(e).getTime(),i=q(t).getTime(),a=q(n).getTime();if(i>a)throw RangeError(`start cannot be later than end.`);return r>=i&&r<=a}function Tn(e,t={}){let n=(q(e).getTime()-q(t.now??Date.now()).getTime())/1e3,r=Math.abs(n),i,a;return r<60?(i=1,a=`second`):r<3600?(i=60,a=`minute`):r<86400?(i=3600,a=`hour`):r<604800?(i=86400,a=`day`):r<2629800?(i=604800,a=`week`):r<31557600?(i=2629800,a=`month`):(i=31557600,a=`year`),new Intl.RelativeTimeFormat(t.locale??`zh-CN`,{numeric:t.numeric??`auto`,style:t.style??`long`}).format(Math.round(n/i),a)}let En=(e,t,n)=>{switch(n){case`day`:e.setDate(e.getDate()+t);break;case`month`:e.setMonth(e.getMonth()+t);break;case`year`:e.setFullYear(e.getFullYear()+t)}},J=(e,t,n)=>({text:e,value:()=>{let e=new Date;return En(e,t,n),e.setHours(0,0,0,0),e}}),Y=(e,t,n,r)=>({text:e,value:()=>{let e=new Date,i=new Date;return En(r?i:e,r?t:-t,n),e.setHours(0,0,0,0),i.setHours(23,59,59,999),[e,i]}});function Dn(e){if(e==null)return``;let t;if(t=typeof e==`string`?new Date(e).getTime():typeof e==`number`?e.toString().length<=10?e*1e3:e:e.getTime(),!Number.isFinite(t))return``;let n=Date.now(),r=n-t,i=Math.abs(r)/6e4,a=Math.abs(r)/36e5,o=Math.abs(r)/864e5,s=new Date(n),c=new Date(t),l=(s.getFullYear()-c.getFullYear())*12+s.getMonth()-c.getMonth(),u=r<0?`后`:`前`;return Math.abs(l)>=12?`${Math.floor(Math.abs(l)/12)}年${u}`:Math.abs(l)>=6?`半年${u}`:Math.abs(l)>=1?`${Math.abs(l)}月${u}`:o>=15?`半月${u}`:o>=7?`${Math.floor(o/7)}周${u}`:o>=1?`${Math.floor(o)}天${u}`:a>=1?`${Math.floor(a)}小时${u}`:i>=1?`${Math.floor(i)}分钟${u}`:`刚刚`}function On(e=!1){let t=new Date,n=new Date;return En(e?n:t,e?1:-1,`month`),t.setHours(0,0,0,0),n.setHours(23,59,59,999),[t,n]}function kn(e){return e.getTime()>Date.now()}function An(){let e=new Date().getHours();return e<5?`夜深了,注意身体哦!`:e<9?`早上好!欢迎回来!`:e<12?`上午好!欢迎回来!`:e<14?`中午好!欢迎回来!`:e<18?`下午好!欢迎回来!`:e<24?`晚上好!欢迎回来!`:`您好!欢迎回来!`}function jn(e=!1){return e?[Y(`后1天`,1,`day`,!0),Y(`后3天`,3,`day`,!0),Y(`后1周`,7,`day`,!0),Y(`后1月`,1,`month`,!0),Y(`后3月`,3,`month`,!0),Y(`后6月`,6,`month`,!0),Y(`后1年`,1,`year`,!0)]:[Y(`近1天`,1,`day`,!1),Y(`近3天`,3,`day`,!1),Y(`近1周`,7,`day`,!1),Y(`近1月`,1,`month`,!1),Y(`近3月`,3,`month`,!1),Y(`近6月`,6,`month`,!1),Y(`近1年`,1,`year`,!1)]}function Mn(e=!1){return e?[J(`今天`,0,`day`),J(`明天`,1,`day`),J(`一周后`,7,`day`),J(`一月后`,1,`month`),J(`一年后`,1,`year`)]:[J(`今天`,0,`day`),J(`昨天`,-1,`day`),J(`一周前`,-7,`day`),J(`一月前`,-1,`month`),J(`一年前`,-1,`year`)]}function Nn(){return gn(new Date)}let Pn=e=>Array.isArray(e),Fn=e=>{if(e.length===0||!Number.isFinite(Number(e)))return!1;let t=e.startsWith(`+`)||e.startsWith(`-`)?e.slice(1):e;return!/^0[box]/iu.test(t)},In=e=>e.startsWith(`--`)?e:(e.startsWith(`ms`)?`-${e}`:e).replace(/([A-Z])/gu,`-$1`).toLowerCase();function Ln(e,t=`px`){if(e==null||e===``)return``;if(t.length===0)throw RangeError(`unit cannot be empty.`);if(typeof e==`number`){if(!Number.isFinite(e))throw RangeError(`value must be finite.`);return e===0?`0`:`${e}${t}`}let n=e.trim();return Fn(n)?Number(n)===0?`0`:`${n}${t}`:e}function Rn(e){if(e==null||e===``)return``;if(Pn(e))return e.map(e=>Rn(e)).filter(e=>e.length>0).join(` `);if(typeof e==`string`){let t=e.trim();return t.length===0?``:t.endsWith(`;`)?t:`${t};`}return Object.entries(e).filter(([,e])=>e!=null&&e!==``).map(([e,t])=>{if(typeof t==`number`&&!Number.isFinite(t))throw RangeError(`Style property "${e}" must be finite.`);return`${In(e)}:${String(t)};`}).join(` `)}let X=globalThis,zn=()=>typeof X.navigator?.userAgent==`string`?X.navigator.userAgent:``,Bn=()=>typeof X.navigator?.maxTouchPoints==`number`?X.navigator.maxTouchPoints:0;function Vn(){let e=X.window;return e!=null&&e.document!==null&&typeof e.document==`object`}function Hn(){return!Vn()&&typeof X.importScripts==`function`}function Un(){return typeof X.process?.versions?.node==`string`}function Wn(){return X.uni!==void 0}function Gn(){let e=X.crypto,t=e?.subtle;return typeof e?.getRandomValues==`function`&&typeof t?.decrypt==`function`&&typeof t.deriveBits==`function`&&typeof t.deriveKey==`function`&&typeof t.digest==`function`&&typeof t.encrypt==`function`&&typeof t.exportKey==`function`&&typeof t.generateKey==`function`&&typeof t.importKey==`function`&&typeof t.sign==`function`&&typeof t.verify==`function`}function Kn(){return Vn()?`browser`:Hn()?`worker`:Un()?`node`:`unknown`}function qn(e=zn()){return/Mobile|iPhone|Android.*Mobile|Windows Phone/iu.test(e)}function Jn(e=zn(),t=Bn()){return/iPad|Android(?!.*Mobile)|Tablet/iu.test(e)||/Macintosh/iu.test(e)&&t>1}let Yn=globalThis,Xn=()=>{let e=Yn.uni;if(e===void 0)return;if(typeof e!=`object`&&typeof e!=`function`||e===null)throw TypeError(`The global uni object does not provide synchronous Storage APIs.`);let t=e;if(typeof t.getStorageSync!=`function`||typeof t.getStorageInfoSync!=`function`||typeof t.removeStorageSync!=`function`||typeof t.setStorageSync!=`function`)throw TypeError(`The global uni object does not provide synchronous Storage APIs.`);return t},Zn={decode:e=>JSON.parse(e),encode:e=>{let t=JSON.stringify(e);if(typeof t!=`string`)throw TypeError(`The storage value is not JSON-serializable.`);return t}},Qn={decode:e=>JSON.parse(Me(e)),encode:e=>{let t=JSON.stringify(e);if(typeof t!=`string`)throw TypeError(`The storage value is not JSON-serializable.`);return je(t)}},Z,$n=e=>typeof e==`object`&&!!e&&!Array.isArray(e),er=e=>{if(typeof e!=`string`||e.length===0)throw TypeError(`Storage keys must be non-empty strings.`)},tr=e=>{let t=e===`local`?Yn.localStorage:Yn.sessionStorage;if(t===void 0)throw Error(`${e}Storage is unavailable in the current runtime.`);return{getItem:e=>t.getItem(e),keys:()=>{let e=[];for(let n=0;n<t.length;n+=1){let r=t.key(n);r!==null&&e.push(r)}return e},removeItem:e=>{t.removeItem(e)},setItem:(e,n)=>{t.setItem(e,n)}}},nr=e=>({getItem:t=>{let n=e.getStorageSync(t);return n===``?e.getStorageInfoSync().keys.includes(t)?n:void 0:n},keys:()=>[...e.getStorageInfoSync().keys],removeItem:t=>{e.removeStorageSync(t)},setItem:(t,n)=>{e.setStorageSync(t,n)}}),rr=(e,t)=>{if(typeof e!=`string`)throw TypeError(`Storage entry "${t}" is not a string.`);try{let t=JSON.parse(e);if(!$n(t)||t.version!==3||typeof t.data!=`string`||!(t.expiresAt===null||typeof t.expiresAt==`number`&&Number.isFinite(t.expiresAt)))throw TypeError(`Unsupported storage envelope.`);return{data:t.data,expiresAt:t.expiresAt,version:3}}catch(e){throw TypeError(`Storage entry "${t}" is corrupted or unsupported.`,{cause:e})}},ir=(e,t,n,r)=>{let i=e=>`${t}${e}`,a=e=>{let n=e.keys();if(!Array.isArray(n)||!n.every(e=>typeof e==`string`))throw TypeError(`Storage backend keys must be strings.`);return[...new Set(n.filter(e=>e.startsWith(t)).map(e=>e.slice(t.length)))].sort()},o=(e,t)=>{er(t);let n=i(t),a=e.getItem(n);if(a==null)return;let o=rr(a,n);if(o.expiresAt===null)return o;let s=r();if(!Number.isFinite(s))throw RangeError(`Storage clock must return a finite timestamp.`);if(s<o.expiresAt)return o;e.removeItem(n)};return{prefix:t,clear(){let t=e();for(let e of a(t))t.removeItem(i(e))},get(t){let r=o(e(),t);if(r!==void 0)try{return n.decode(r.data)}catch(e){throw TypeError(`Storage entry "${i(t)}" could not be decoded.`,{cause:e})}},has:t=>o(e(),t)!==void 0,keys:()=>a(e()),pruneExpired(){let t=e(),n=0;for(let e of a(t))t.getItem(i(e))!=null&&o(t,e)===void 0&&(n+=1);return n},remove(t){er(t),e().removeItem(i(t))},removeByPrefix(t){er(t);let n=e();for(let e of a(n))e.startsWith(t)&&n.removeItem(i(e))},set(t,a,o={}){if(er(t),a===void 0)throw TypeError(`Top-level undefined cannot be stored; remove the key instead.`);let s=null;if(o.ttlMs!==void 0){if(!Number.isFinite(o.ttlMs)||o.ttlMs<=0)throw RangeError(`ttlMs must be a positive finite number.`);let e=r();if(!Number.isFinite(e)||!Number.isFinite(e+o.ttlMs))throw RangeError(`Storage expiry exceeds the supported timestamp range.`);s=e+o.ttlMs}let c;try{if(c=n.encode(a),typeof c!=`string`)throw TypeError(`Storage codecs must return strings.`)}catch(e){throw TypeError(`The storage value could not be encoded.`,{cause:e})}e().setItem(i(t),JSON.stringify({data:c,expiresAt:s,version:3}))}}},ar=()=>{if(Z===void 0&&lr(),Z===void 0)throw Error(`Storage configuration could not be initialized.`);return Z},or=(e,t)=>{let n=()=>{let n=e(ar());if(n===void 0)throw Error(`${t} is unavailable in uni-app.`);return n};return{get prefix(){return n().prefix},clear:()=>{n().clear()},get:e=>n().get(e),has:e=>n().has(e),keys:()=>n().keys(),pruneExpired:()=>n().pruneExpired(),remove:e=>{n().remove(e)},removeByPrefix:e=>{n().removeByPrefix(e)},set:(e,t,r)=>{n().set(e,t,r)}}},sr=or(e=>e.local,`Local`),cr=or(e=>e.session,`Session`);function lr(e={}){let t=e.prefix??`fast__`;if(typeof t!=`string`||t.length===0)throw TypeError(`Storage prefix must be a non-empty string.`);if(e.codec!==void 0&&e.crypto===!0)throw TypeError(`Storage codec and crypto options cannot be used together.`);let n=e.codec??(e.crypto===!0?Qn:Zn),r=e.now??Date.now;if(Z!==void 0){if(Z.prefix===t&&Z.codec===n&&Z.now===r)return;throw Error(`Storage has already been configured with different options.`)}let i=Xn(),a={codec:n,local:ir(i===void 0?()=>tr(`local`):()=>nr(i),t,n,r),now:r,prefix:t};i===void 0&&(a.session=ir(()=>tr(`session`),t,n,r)),Z=a}function ur(){return Z!==void 0}let Q=`en-US`,dr=1e6,fr=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,pr=globalThis,mr=()=>{let e=pr.crypto;if(typeof e?.getRandomValues!=`function`)throw Error(`Web Crypto random generation is unavailable in the current runtime.`);return e},hr=e=>{e[6]=(e[6]??0)&15|64,e[8]=(e[8]??0)&63|128;let t=Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`},gr=(e,t)=>{let n=pr.Intl?.Segmenter;if(typeof n!=`function`)throw Error(`Intl.Segmenter is unavailable in the current runtime.`);let r=new n(t??Q,{granularity:`grapheme`});return Array.from(r.segment(e),({segment:e})=>e)};function _r(e,t=10){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`maxDepth must be a non-negative safe integer.`);let n=e;for(let e=0;e<t;e+=1){let e=decodeURIComponent(n);if(e===n)break;n=e}return n}function vr(e){let t=e.indexOf(`#`),n=t<0?e:e.slice(0,t),r=/^[a-z][a-z\d+.-]*:\/\//iu.test(n),i=n.indexOf(`?`);if(r&&i<0)return{};let a=r?n.slice(i+1):n.replace(/^\?/u,``),o={};for(let[e,t]of new URLSearchParams(a)){let n=Object.hasOwn(o,e)?o[e]:void 0;n===void 0?Object.defineProperty(o,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):Array.isArray(n)?n.push(t):Object.defineProperty(o,e,{configurable:!0,enumerable:!0,value:[n,t],writable:!0})}return o}function yr(e){if(e.trim().length===0)return!1;try{return JSON.parse(e),!0}catch{return!1}}function br(e){return e.trim().replace(/(\p{Ll}|\p{N})(\p{Lu})/gu,`$1 $2`).replace(/(\p{Lu})(\p{Lu}\p{Ll})/gu,`$1 $2`).split(/[\s_-]+/u).filter(e=>e.length>0)}function xr(e,t){let n=Array.from(e),r=n.shift();return r===void 0?``:r.toLocaleUpperCase(t??Q)+n.join(``)}function Sr(e,t){let n=Array.from(e),r=n.shift();return r===void 0?``:r.toLocaleLowerCase(t??Q)+n.join(``)}function Cr(e,t){return br(e).map((e,n)=>{let r=e.toLocaleLowerCase(t??Q);return n===0?r:xr(r,t)}).join(``)}function wr(e,t){return xr(Cr(e,t),t)}function Tr(e,t){return br(e).map(e=>e.toLocaleLowerCase(t??Q)).join(`-`)}function Er(e,t,n=`…`,r){if(!Number.isSafeInteger(t)||t<0)throw RangeError(`maxLength must be a non-negative safe integer.`);let i=gr(e,r);return i.length>t?i.slice(0,t).join(``)+n:e}function Dr(e,t=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`){if(!Number.isSafeInteger(e)||e<0||e>dr)throw RangeError(`length must be a safe integer from 0 through ${dr}.`);let n=Array.from(t);if(n.length===0)throw RangeError(`alphabet cannot be empty.`);if(new Set(n).size!==n.length)throw RangeError(`alphabet cannot contain duplicate characters.`);if(n.length>4294967296)throw RangeError(`alphabet cannot contain more than 2^32 characters.`);if(e===0)return``;let r=mr(),i=Math.floor(4294967296/n.length)*n.length,a=[];for(;a.length<e;){let t=e-a.length,o=r.getRandomValues(new Uint32Array(Math.min(t,16384)));for(let t of o){if(t>=i)continue;let r=n[t%n.length];if(r!==void 0&&(a.push(r),a.length===e))break}}return a.join(``)}function Or(){let e=mr();return typeof e.randomUUID==`function`?e.randomUUID():hr(e.getRandomValues(new Uint8Array(16)))}function kr(e){return fr.test(e)}function Ar(e){return e.replace(/[&<>"']/gu,e=>{switch(e){case`&`:return`&amp;`;case`<`:return`&lt;`;case`>`:return`&gt;`;case`"`:return`&quot;`;default:return`&#39;`}})}function jr(e){return e.trim().replace(/\s+/gu,` `)}let Mr=`identity:installation-id`,Nr=e=>{if(!kr(e))throw TypeError(`Installation Identity values must be RFC 4122 version 4 UUIDs.`)},Pr,Fr=()=>(Pr??=Mr,Pr);function Ir(e={}){let t=e.cacheKey??Mr;if(typeof t!=`string`||t.length===0||t.trim()!==t)throw TypeError(`Installation Identity cacheKey must be a non-empty string without surrounding whitespace.`);if(Pr===void 0){Pr=t;return}if(Pr!==t)throw Error(`Installation Identity has already been configured with a different cacheKey.`)}let $={get cacheKey(){return Fr()},deviceId:``,clear(){sr.remove($.cacheKey),$.deviceId=``},getOrCreate(e){let t=e??($.deviceId.length>0?$.deviceId:$.read())??Or();return Nr(t),sr.set($.cacheKey,t),$.deviceId=t,t},read(){let e=sr.get($.cacheKey);if(e!==void 0){if(typeof e!=`string`)throw TypeError(`The stored identity is corrupted.`);return Nr(e),e}}};function Lr(e){return $.getOrCreate(e)}let Rr={debug:10,info:20,warn:30,error:40},zr=e=>typeof e==`string`&&Object.hasOwn(Rr,e),Br=globalThis,Vr=()=>Br.uni!==void 0&&Br.plus!==void 0,Hr=e=>{if(typeof e==`string`)return e;if(typeof e==`bigint`)return`${e.toString()}n`;if(e instanceof Error)return e.stack??`${e.name}: ${e.message}`;let t=new WeakSet;try{let n=JSON.stringify(e,(e,n)=>typeof n==`bigint`?`${n.toString()}n`:typeof n!=`object`||!n?n:t.has(n)?`[Circular]`:(t.add(n),n),2);return typeof n==`string`?n:String(e)}catch{return String(e)}},Ur={debug:(...e)=>{typeof console.debug==`function`?console.debug(...e):console.log(...e)},log:(...e)=>{console.log(...e)},warn:(...e)=>{console.warn(...e)},error:(...e)=>{console.error(...e)}};function Wr(e={}){let t=e.level??`info`,n=e.prefix??`Fast`,r=e.sink??Ur;if(!zr(t))throw RangeError(`Unknown logger level: ${String(t)}.`);if(typeof n!=`string`||n.length===0)throw RangeError(`Logger prefix must be a non-empty string.`);let i=t,a=n,o=e.uniAppPlusSplit??!1,s=(e,t,n,s)=>{if(typeof t!=`string`)throw TypeError(`Logger scope must be a string.`);if(t.length===0||t.trim()!==t)throw RangeError(`Logger scope must be a non-empty string without surrounding whitespace.`);if(Rr[e]<Rr[i])return;let c=`[${a}:${t}]`,l=e===`info`?`log`:e;if(o&&Vr()){r[l](`${c} ${n}`);for(let e of s)r[l](Hr(e));return}r[l](c,n,...s)};return{debug:(e,t,...n)=>{s(`debug`,e,t,n)},info:(e,t,...n)=>{s(`info`,e,t,n)},warn:(e,t,...n)=>{s(`warn`,e,t,n)},error:(e,t,...n)=>{s(`error`,e,t,n)}}}let Gr=Wr(),Kr=e=>Array.isArray(e),qr=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0})};function Jr(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function Yr(e,t){return Object.hasOwn(e,t)}function Xr(e,t){let n={};for(let r of t)Object.prototype.propertyIsEnumerable.call(e,r)&&qr(n,r,e[r]);return n}function Zr(e,t){let n={...e};for(let e of t)Reflect.deleteProperty(n,e);return n}function Qr(e,t){let n={};for(let r of Reflect.ownKeys(e))Object.prototype.propertyIsEnumerable.call(e,r)&&qr(n,r,t(e[r],r,e));return n}function $r(e,t){if(Object.is(e,t))return!0;let n=Reflect.ownKeys(e).filter(t=>Object.prototype.propertyIsEnumerable.call(e,t)),r=Reflect.ownKeys(t).filter(e=>Object.prototype.propertyIsEnumerable.call(t,e));return n.length===r.length&&n.every(n=>Object.hasOwn(t,n)&&Object.is(Reflect.get(e,n),Reflect.get(t,n)))}let ei=e=>{if(typeof e==`number`&&!Number.isFinite(e))throw RangeError(`Query parameter numbers must be finite.`);return String(e)};function ti(e,t={}){let n=Object.entries(e);t.sort&&n.sort(([e],[t])=>e<t?-1:+(e>t));let r=new URLSearchParams;for(let[e,t]of n){let n=Kr(t)?t:[t];for(let t of n)t!=null&&r.append(e,ei(t))}let i=r.toString();return t.space===`percent`&&(i=i.replace(/\+/gu,`%20`)),i&&t.prefixQuestionMark?`?${i}`:i}let ni=e=>`on${e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}`;function ri(e,n,r=[]){let i=new Set(r),a=n;return(0,t.computed)(()=>{let t={},n=new Set;for(let r of Object.keys(e)){if(i.has(r))continue;if(r.length===0||/\s/u.test(r))throw TypeError(`Invalid Vue event name: "${r}".`);let e=ni(r);if(n.has(e))throw TypeError(`Vue events map to the same handler property: "${e}".`);n.add(e),Object.defineProperty(t,e,{enumerable:!0,value:(...e)=>{a(r,...e)},writable:!0})}return t})}function ii(e,t){return e(t),t}async function ai(e,...t){if(e!=null)return await e(...t)}let oi=e=>{if(typeof e!=`object`||!e)throw TypeError(`Vue plugin installation requires a Vue 3 App.`);let t=e;if(typeof t.component!=`function`||typeof t.directive!=`function`)throw TypeError(`Vue plugin installation requires component() and directive() registration methods.`);return t},si=e=>{let t=e.name;if(typeof t!=`string`||t.length===0||/\s/u.test(t))throw TypeError(`Installable Vue components must expose a non-empty name without whitespace.`);return t},ci=(e,t)=>{let n=si(t),r=e.component(n);if(r!==void 0&&r!==t)throw Error(`Vue component name "${n}" is already registered by another component.`);return{component:t,name:n,registered:r===t}};function li(e,t){let n=new Set([si(e)]);if(`install`in Object(e))throw TypeError(`The Vue component already defines an install property.`);let r=Object.entries(t??{});if(t!==void 0&&Object.getOwnPropertySymbols(t).some(e=>Object.prototype.propertyIsEnumerable.call(t,e)))throw TypeError(`Vue component extras must use string property names.`);for(let[t,i]of r){let r=si(i);if(n.has(r))throw TypeError(`Vue component name "${r}" is registered more than once.`);if(n.add(r),t===`install`||t in Object(e))throw TypeError(`Vue component extra "${t}" would overwrite a property on the main component.`)}let i=e;for(let[e,t]of r)Object.defineProperty(i,e,{configurable:!0,enumerable:!0,value:t,writable:!0});return i.install=t=>{let n=oi(t),i=[e,...r.map(([,e])=>e)].map(e=>ci(n,e));for(let e of i)e.registered||n.component(e.name,e.component)},i}function ui(e){if(`install`in Object(e))throw TypeError(`The Vue component already defines an install property.`);let t=e;return t.install=()=>void 0,t}function di(e,t){if(t.length===0||/\s/u.test(t)||t.startsWith(`v-`))throw TypeError(`Installable Vue directives require a name without whitespace or a v- prefix.`);if(`install`in Object(e))throw TypeError(`The Vue directive already defines an install property.`);let n=e;return n.install=n=>{let r=oi(n),i=r.directive(t);if(i!==void 0&&i!==e)throw Error(`Vue directive name "${t}" is already registered by another directive.`);i!==e&&r.directive(t,e)},n}function fi(e){return e}function pi(e,n,r=[]){let i=new Set(r);return(0,t.computed)(()=>{let t={};for(let r of Reflect.ownKeys(n))i.has(r)||!Object.hasOwn(e,r)||Object.defineProperty(t,r,{configurable:!0,enumerable:!0,value:Reflect.get(e,r),writable:!0});return t})}function mi(e){let n=(0,t.getCurrentInstance)();if(n===null)throw Error(`useRender must be called from inside a setup function.`);n.render=e}function hi(){return Object}function gi(e){return e}return e.AESDecrypt=Zt,e.AESDecryptAuthenticated=$t,e.AESDecryptWithPassword=tn,e.AESEncrypt=Xt,e.AESEncryptAuthenticated=Qt,e.AESEncryptWithPassword=en,e.DeriveECDHKeySHA256=pn,e.DeriveECDHSecret=fn,e.ECDSASign=ln,e.ECDSAVerify=un,e.FixedTimeEquals=Pt,e.GenerateECDHKeyPair=dn,e.GenerateECDSAKeyPair=cn,e.GenerateRSAKeyPair=nn,e.GenerateRandomBytes=K,e.HKDFSHA256=Yt,e.HMACSHA256Encrypt=Ut,e.HMACSHA384Encrypt=Wt,e.HMACSHA512Encrypt=Gt,e.HashPasswordPBKDF2SHA256=qt,e.Local=sr,e.MD5Encrypt=Ft,e.PBKDF2SHA256=Kt,e.RSADecryptOAEP=an,e.RSAEncryptOAEP=rn,e.RSASignPSS=on,e.RSAVerifyPSS=sn,e.SHA1Encrypt=It,e.SHA256Bytes=Lt,e.SHA256Encrypt=Rt,e.SHA384Bytes=zt,e.SHA384Encrypt=Bt,e.SHA512Bytes=Vt,e.SHA512Encrypt=Ht,e.Session=cr,e.VerifyPasswordPBKDF2SHA256=Jt,e.addCssUnit=Ln,e.addDays=vn,e.addMonths=yn,e.addYears=bn,e.allEqualBy=b,e.average=de,e.base64StorageCodec=Qn,e.callOptionalFunction=ai,e.camelCase=Cr,e.chunk=d,e.clamp=se,e.configureInstallationIdentity=Ir,e.configureStorage=lr,e.contrastRatio=We,e.createDateRangeShortcuts=jn,e.createDateShortcuts=Mn,e.createLogger=Wr,e.createOneMonthRangeFromToday=On,e.debounce=k,e.decodeBase64=xe,e.decodeBase64Bytes=I,e.decodeBase64Url=Ce,e.decodeBase64UrlBytes=R,e.decodeLatin1Base64=Te,e.decodeSecureBase64=Me,e.decodeURIComponentRepeatedly=_r,e.definePropType=fi,e.detectRuntime=Kn,e.difference=_,e.encodeBase64=be,e.encodeBase64Bytes=F,e.encodeBase64Url=Se,e.encodeBase64UrlBytes=L,e.encodeLatin1Base64=we,e.encodeSecureBase64=je,e.endOfDay=_n,e.escapeHtml=Ar,e.formatBytes=pe,e.formatChineseRelativeTime=Dn,e.formatHexColor=Re,e.formatRelativeTime=Tn,e.generateUuidV4=Or,e.getLocalDayBounds=Cn,e.getLocalTimeGreeting=An,e.getOrCreateInstallationId=Lr,e.getStartOfToday=Nn,e.groupBy=h,e.hasDuplicatesBy=y,e.hasOwn=Yr,e.hasWebCrypto=Gn,e.inRange=ce,e.installationIdentity=$,e.intersection=v,e.isBrowser=Vn,e.isDateAfterNow=kn,e.isFuture=Sn,e.isMobileUserAgent=qn,e.isNode=Un,e.isPlainObject=Jr,e.isSameDay=xn,e.isStorageConfigured=ur,e.isTabletUserAgent=Jn,e.isUniApp=Wn,e.isUuidV4=kr,e.isValidDate=hn,e.isValidJson=yr,e.isWebWorker=Hn,e.isWithinInterval=wn,e.kebabCase=Tr,e.lerp=fe,e.logger=Gr,e.lowerFirst=Sr,e.makeSlots=hi,e.mapConcurrent=O,e.mapValues=Qr,e.mixHexColorWithBlack=Be,e.mixHexColorWithWhite=Ve,e.mixHexColors=ze,e.normalizeWhitespace=jr,e.omit=Zr,e.parseHexColor=Le,e.parseQueryString=vr,e.partition=g,e.pascalCase=wr,e.pick=Xr,e.pickHigherContrastColor=Ge,e.relativeLuminance=Ue,e.removeNullishValues=f,e.retry=D,e.roundTo=le,e.secureRandomInt=me,e.secureRandomString=Dr,e.serializeStyle=Rn,e.shallowEqual=$r,e.sleep=T,e.splitWords=br,e.startOfDay=gn,e.sum=ue,e.throttle=A,e.toDate=q,e.toQueryString=ti,e.truncateGraphemes=Er,e.unique=p,e.uniqueBy=m,e.upperFirst=xr,e.useEmits=ri,e.useExpose=ii,e.useProps=pi,e.useRender=mi,e.withDefineType=gi,e.withInstall=li,e.withInstallDirective=di,e.withNoopInstall=ui,e.withTimeout=E,e})({},Vue);
3
+ //# sourceMappingURL=index.global.min.js.map